{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5cba185b-4685-400f-89e3-36419589c754",
   "metadata": {},
   "source": [
    "<font size=\"7\">模型评估方法 - ROC曲线与KS曲线</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7baf577-a0ae-46dd-8b5e-5e62c2d9184f",
   "metadata": {},
   "source": [
    "案例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "69cc9b0a-eb84-4d7b-b284-546c423e8a53",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1]\n",
      "0.7977288857345636\n",
      "[[0.82041509 0.17958491]\n",
      " [0.84029656 0.15970344]\n",
      " [0.7981937  0.2018063 ]\n",
      " [0.62989223 0.37010777]\n",
      " [0.61636604 0.38363396]]\n"
     ]
    }
   ],
   "source": [
    "# 1.读取数据\n",
    "import pandas as pd\n",
    "df = pd.read_excel(r\"C:\\Users\\huaihuai\\Desktop\\商业数据分析\\代码\\@Python大数据分析与机器学习商业案例实战\\第4章 逻辑回归模型\\源代码汇总_Jupyter Notebook格式（推荐）\\股票客户流失.xlsx\")\n",
    "\n",
    "# 2.划分特征变量和目标变量\n",
    "X = df.drop(columns='是否流失') \n",
    "y = df['是否流失']\n",
    "\n",
    "# 3.划分训练集和测试集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)\n",
    "\n",
    "# 4.模型搭建\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "model = LogisticRegression()\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 5.模型使用1 - 预测数据结果\n",
    "y_pred = model.predict(X_test)\n",
    "print(y_pred[0:100])  # 打印预测内容的前100个看看\n",
    "\n",
    "# 查看全部的预测准确度\n",
    "from sklearn.metrics import accuracy_score\n",
    "score = accuracy_score(y_pred, y_test)\n",
    "print(score)  # 打印整体的预测准确度\n",
    "\n",
    "# 6.模型使用2 - 预测概率\n",
    "y_pred_proba = model.predict_proba(X_test)  \n",
    "print(y_pred_proba[0:5])  # 打印前5个客户的分类概率"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "38d5fe60-5462-4a1f-91cc-54102553d43b",
   "metadata": {},
   "source": [
    "分类模型的评估方法 - ROC曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f53bfc80-b080-4ec9-8dfe-d6c0b47a94e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[968  93]\n",
      " [192 156]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "m = confusion_matrix(y_test, y_pred)  # 传入预测值和真实值\n",
    "print(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6a0cda95-b2a7-4850-bca2-486a63e1dd8a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0（预测不流失）</th>\n",
       "      <th>1（预测流失）</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0（实际不流失）</th>\n",
       "      <td>968</td>\n",
       "      <td>93</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1（实际流失）</th>\n",
       "      <td>192</td>\n",
       "      <td>156</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0（预测不流失）  1（预测流失）\n",
       "0（实际不流失）       968       93\n",
       "1（实际流失）        192      156"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = pd.DataFrame(m, index=['0（实际不流失）', '1（实际流失）'], columns=['0（预测不流失）', '1（预测流失）'])\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8479b78a-a92c-4998-8125-1150df6cf52d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.83      0.91      0.87      1061\n",
      "           1       0.63      0.45      0.52       348\n",
      "\n",
      "    accuracy                           0.80      1409\n",
      "   macro avg       0.73      0.68      0.70      1409\n",
      "weighted avg       0.78      0.80      0.79      1409\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report # 计算命中率 无需手动计算\n",
    "print(classification_report(y_test, y_pred))  # 传入预测值和真实值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "646d798f-04fa-459f-acdd-f90ea1a3fe6b",
   "metadata": {},
   "source": [
    "评估股票客户流失预警模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "6b76842c-dbe4-4de3-a140-1772a004bf00",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.17958491, 0.15970344, 0.2018063 , ..., 0.04220526, 0.09782415,\n",
       "       0.63586812])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred_proba[:,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "01211717-2339-4c86-9535-5116f3b81bc0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1.计算ROC曲线需要的假警报率（fpr）、命中率（tpr）及阈值（thres）\n",
    "from sklearn.metrics import roc_curve\n",
    "fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5c68c14c-237a-44b5-8442-9333602f8cef",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857304</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         阈值      假警报率       命中率\n",
       "0       inf  0.000000  0.000000\n",
       "1  0.930369  0.000000  0.002874\n",
       "2  0.867342  0.000000  0.034483\n",
       "3  0.864187  0.001885  0.034483\n",
       "4  0.857304  0.001885  0.040230"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 2.查看假警报率（fpr）、命中率（tpr）及阈值（thres）\n",
    "a = pd.DataFrame()  # 创建一个空DataFrame \n",
    "a['阈值'] = list(thres)\n",
    "a['假警报率'] = list(fpr)\n",
    "a['命中率'] = list(tpr)\n",
    "a.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b9af9664-77ad-4ed2-baad-fc3fe533cb8d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857304</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>373</th>\n",
       "      <td>0.034940</td>\n",
       "      <td>0.918944</td>\n",
       "      <td>0.994253</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>374</th>\n",
       "      <td>0.034861</td>\n",
       "      <td>0.918944</td>\n",
       "      <td>0.997126</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>375</th>\n",
       "      <td>0.032088</td>\n",
       "      <td>0.932139</td>\n",
       "      <td>0.997126</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>376</th>\n",
       "      <td>0.032016</td>\n",
       "      <td>0.932139</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>377</th>\n",
       "      <td>0.023578</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>378 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           阈值      假警报率       命中率\n",
       "0         inf  0.000000  0.000000\n",
       "1    0.930369  0.000000  0.002874\n",
       "2    0.867342  0.000000  0.034483\n",
       "3    0.864187  0.001885  0.034483\n",
       "4    0.857304  0.001885  0.040230\n",
       "..        ...       ...       ...\n",
       "373  0.034940  0.918944  0.994253\n",
       "374  0.034861  0.918944  0.997126\n",
       "375  0.032088  0.932139  0.997126\n",
       "376  0.032016  0.932139  1.000000\n",
       "377  0.023578  1.000000  1.000000\n",
       "\n",
       "[378 rows x 3 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f5627724-ba5b-42b8-9c5e-ef16a7b25ae2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAHCCAYAAAD4qFOaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9+klEQVR4nO3deXhU9aH/8c8kk0wWspIQIAQIBBGVgGAQUKAggj82KS4V9dr2at0qgkuqtKC3tQp1QVpvS+WKIIio1brUHQWCCC4RCcSwCBIIYQsxzASSTJY5vz+QgQgJScjMmeX9ep48zzlnzjfz4ajMxzPnnK/FMAxDAAAAfizE7AAAAABni0IDAAD8HoUGAAD4PQoNAADwexQaAADg9yg0AADA71FoAACA36PQAAAAv0ehAQAAfo9CAyAg7N+/Xx9//LGcTqckad++fXrttddkt9tNTgbAGyg0AAJCTk6OLr/8ch09elSStHHjRl1zzTXav39/o+MMw9Cll16qhQsX1tv+4osv6vzzz9eWLVtUWVmpkpISj2UHcPYoNABa3apVq2SxWNw/SUlJuvLKK7Vlyxb3Pu+++64yMzMVERGh8847T2+88cYpv+eJJ55QWlqaoqKiNGnSJB04cKDB94yKipIkxcfHS5Kio6MlSTabrdGsH330kb766itdeOGF9ba3adNGBQUF6tChg6ZPn16vLAHwPRQaAB6zcOFCffHFF/r73/+ubdu2aciQISorK9MXX3yhiRMnqkuXLnrrrbfUq1cvXXPNNVq3bp177OzZs/X73/9e99xzj958800VFRXpF7/4RYPvZbFYJEkhIc37a+1Pf/qTZsyYob59+6q8vNy9/XgxioqK0qOPPqq0tDR9//33zfrdALzIAIBWtnLlSkOSsW7dOve2jRs3GpKMF154wZg0aZKRkpJiVFVVGYZhGE6n00hJSTEmTZpkGIZh2O12Izo62rj77rvd47/88ktDkrF27VrDMAxjyZIlhiQjPDzcsNlsRlhYmCHJsNlshs1mM8LDw+u9fnz9lVdecf/OxYsXGz169DCqqqqMTz/91IiNjTU+++yzen+GgwcPGmvXrjWeeeYZ48orrzR+//vfe/z4AWg+ztAA8IrevXvLZrNpz549ysnJ0ZAhQ9xfB4WHh2vo0KHKycmRJC1fvlxHjx7V1Vdf7R7fr18/hYSEKD8/X5IUEREhSdq6dauqqqr073//W5JUVVWlqqoqffLJJ/Ve//bbbyWd+ApqzZo1mjJliubNm6eamhr96U9/0qBBg3TkyBE9+uijevTRRyVJnTt31pQpU7RhwwYNHjxYV1xxhacPFYAWsJodAEBwKCsrk9PpVHR0tEpLS9W5c+d6r3fq1EmlpaUqLy/Xpk2bJEk9e/Z0vx4aGqoPP/xQ3bp1c6+3xPFxH3zwgex2u0aOHCmbzabw8HAVFBTomWeeUVFRkYYOHaqPP/5YGzduVI8ePdzjKyoqVF5erpiYmBa9PwDP4AwNAI8rKSnRlClTFB4erokTJ0o6cdHuccfXy8vLdfDgQUlSYmJivX1GjhzpLjTHr5lpqSlTpujLL79UZWWlhgwZoj//+c/q1KmT/vKXv+ill17SPffcI0n65ptv9K9//UszZ87Uz372MyUkJLjPBgHwHZyhAeAxgwYNci8nJyfrpZdektV67K8dwzDq7Xt83WKxuJ8l05QLfHv27CmLxSKXyyXpxFdRx3/f8dd/+n4pKSlKSUnRCy+8oMOHD+uuu+6SJL322mv6z3/+4z5LdOutt6pv377KzMzUjTfeqCeeeEK9e/du3oEA4HGcoQHgMYsXL9b69euVlpamyy+/XFdddZXi4uIk6ZRboI+vx8bGqk2bNqfdZ9SoUVqyZEm9bc29huZkH330kaZOnap58+appKREmzdvVm1trXr16qXZs2dr3LhxuvXWW7Vq1Sr95je/0UsvvaS2bdu6SxMA38EZGgAe06NHD1144YV64IEHNHXqVP3xj39URkaG2rVrp127dtXbt6ioSO3atVN0dLT7mpXvv/9effr0kSRVV1fr448/1s9//vNWyeZwODR+/HjV1NRowIABslqtGjx4sFatWuXe59tvv9XLL7+sXbt2aeLEiYqNjdWRI0da5f0BtC7O0ADwuFtuuUXt27fXrFmzJEnDhw/Xp59+qqqqKkmS0+nUp59+quHDh0uSRo8eLUl6++233b9j7dq1MgxD/fv3b5VMsbGxWrp0qT777DPt27dPTqezXpmRpIkTJ+qrr75SVlaWUlNTtXr1amVmZrbK+wNoXRQaAB5ns9n0u9/9TkuWLNHu3buVnZ2tw4cP6+qrr9aHH36oyZMn64cfftB9990n6diZnVtuuUWPPPKI5s6dq3feeUe33HKLBg0apAEDBkg69Rqclrj66qvVvXt3bdu2TX/96181efJkLV682P36+vXrZbVadfToUb399tuKiYmp9/A9AL6DQgPAK2699VYlJSXpL3/5i/r376+3335bu3fv1oQJE7Rlyxa99tprysrKcu8/b948ZWdna/bs2br22mvVr1+/emdsamtrJR276DciIkKTJk2SdOyi4IiICF122WX1Xj///PMlyX3x8Hvvvac2bdooJSVF1157rdatW6cBAwZoyJAhOnjwoG655RbdcMMNmjlzpqKiovSHP/zB/ee45ZZbPH/AADSLxWiN/80BAC978cUX9V//9V/auXOnunbtesb9t2/frh49euiVV17Rtddeq7q6Oj3++OMaNWqU+vXrJ4vFopqaGk2bNk2LFi1SWlqaXnzxRV100UVas2aNRo8ere7du2vz5s166qmndPfdd3v+DwmgySg0AHCSZ599Vna7XVOnTq03seX69et1zz33qGvXrnr++edb/GA/AJ5BoQEAAH6Pa2gAAIDfo9AAAAC/R6EBAAB+LyieFOxyubR3717FxMSc9YR2AADAOwzDUHl5uTp27HjGud2CotDs3btXaWlpZscAAAAtUFRUpE6dOjW6T1AUmpiYGEnHDkhsbKzJaQAAQFM4HA6lpaW5P8cbExSF5vjXTLGxsRQaAAD8TFMuF+GiYAAA4PcoNAAAwO9RaAAAgN+j0AAAAL9HoQEAAH6PQgMAAPwehQYAAPg9Cg0AAPB7FBoAAOD3KDQAAMDvmVZoSktLlZ6ersLCwibtn5OTo169eikpKUlz5szxbDgAAOBXTCk0hw4d0rhx45pcZkpKSjRhwgRNnjxZ69at09KlS7Vy5UrPhgQAAH7DlMkpr7vuOl133XX6/PPPm7T/0qVL1aFDB82cOVMWi0UPPfSQFixYoOHDh3s4KQAA/qGmzqUDjirT3j8yLFRt29hMe39TCs38+fPVrVs3TZs2rUn75+XlacSIEe7ZNgcMGKDp06c3uL/T6ZTT6XSvOxyOs8oLAICvqK51qaisot42wzA07pk1qqpxmZRKmtCno/42+ULT3t+UQtOtW7dm7e9wOHTeeee512NjY1VcXNzg/rNmzdIf//jHFucDAMDTKqvr9P2hI80ed+X/fqZal9HoPjar968osYZavP6e9d7f1HdvIqvVKpvtxGmsiIgIVVRUNLj/9OnTde+9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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 3.绘制ROC曲线\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文\n",
    "plt.plot(fpr, tpr)  # 通过plot()函数绘制折线图\n",
    "plt.title('ROC曲线')  # 添加标题，注意如果要写中文，需要在之前添加一行代码：plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.xlabel('FPR')  # 添加X轴标签\n",
    "plt.ylabel('TPR')  # 添加Y轴标\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "88caa6bb-03b0-455a-b061-bf4841e64f02",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8103854528908967"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 4.求出模型的AUC值\n",
    "from sklearn.metrics import roc_auc_score\n",
    "score = roc_auc_score(y_test, y_pred_proba[:,1])\n",
    "score"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "543bfe11-8ccc-4c6a-b433-d0d237c9ddc2",
   "metadata": {},
   "source": [
    "对阈值取值的理解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1011a5a8-62ce-4ee5-a63a-67f7aa1610a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9303688251550154"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max(y_pred_proba[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "43219414-a632-453c-bc6c-e28c48c6657e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>分类为0概率</th>\n",
       "      <th>分类为1概率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>326</th>\n",
       "      <td>0.069631</td>\n",
       "      <td>0.930369</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>366</th>\n",
       "      <td>0.085373</td>\n",
       "      <td>0.914627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>662</th>\n",
       "      <td>0.092923</td>\n",
       "      <td>0.907077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1154</th>\n",
       "      <td>0.105118</td>\n",
       "      <td>0.894882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1036</th>\n",
       "      <td>0.105906</td>\n",
       "      <td>0.894094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1093</th>\n",
       "      <td>0.111303</td>\n",
       "      <td>0.888697</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1164</th>\n",
       "      <td>0.115550</td>\n",
       "      <td>0.884450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>891</th>\n",
       "      <td>0.116594</td>\n",
       "      <td>0.883406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>437</th>\n",
       "      <td>0.123060</td>\n",
       "      <td>0.876940</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1153</th>\n",
       "      <td>0.127293</td>\n",
       "      <td>0.872707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>749</th>\n",
       "      <td>0.129632</td>\n",
       "      <td>0.870368</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>0.132658</td>\n",
       "      <td>0.867342</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>681</th>\n",
       "      <td>0.133410</td>\n",
       "      <td>0.866590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1327</th>\n",
       "      <td>0.135813</td>\n",
       "      <td>0.864187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>264</th>\n",
       "      <td>0.136599</td>\n",
       "      <td>0.863401</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        分类为0概率    分类为1概率\n",
       "326   0.069631  0.930369\n",
       "366   0.085373  0.914627\n",
       "662   0.092923  0.907077\n",
       "1154  0.105118  0.894882\n",
       "1036  0.105906  0.894094\n",
       "1093  0.111303  0.888697\n",
       "1164  0.115550  0.884450\n",
       "891   0.116594  0.883406\n",
       "437   0.123060  0.876940\n",
       "1153  0.127293  0.872707\n",
       "749   0.129632  0.870368\n",
       "49    0.132658  0.867342\n",
       "681   0.133410  0.866590\n",
       "1327  0.135813  0.864187\n",
       "264   0.136599  0.863401"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = pd.DataFrame(y_pred_proba, columns=['分类为0概率', '分类为1概率'])\n",
    "a = a.sort_values('分类为1概率', ascending=False)\n",
    "a.head(15)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15ca851c-876c-4461-a1e5-91b0502687c9",
   "metadata": {},
   "source": [
    "KS曲线绘制"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "5a02e58d-2ba5-411a-85e5-07b28445acb5",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:,1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "64772285-a26f-476d-9c3f-0f13cc70d174",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857304</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         阈值      假警报率       命中率\n",
       "0       inf  0.000000  0.000000\n",
       "1  0.930369  0.000000  0.002874\n",
       "2  0.867342  0.000000  0.034483\n",
       "3  0.864187  0.001885  0.034483\n",
       "4  0.857304  0.001885  0.040230"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = pd.DataFrame()  # 创建一个空DataFrame \n",
    "a['阈值'] = list(thres)\n",
    "a['假警报率'] = list(fpr)\n",
    "a['命中率'] = list(tpr)\n",
    "a.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "1a2e3f2d-d9f7-4bec-88c5-395951c24e97",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGsCAYAAADg5swfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB6K0lEQVR4nO3dd3gU9drG8e/upof0hHQ6hN5Dr4KAUu2ASlEUbEcUOYpHPVhe4VgAGx5RFBCPqBSlCCjSBKREaggllJBCQgpJNr3szvvHwGKkJSHJ7G6ez3Xl2qm7dxggT2Z+RacoioIQQgghhAb0WgcQQgghRO0lhYgQQgghNCOFiBBCCCE0I4WIEEIIITQjhYgQQgghNCOFiBBCCCE0I4WIEEIIITTjoHWAmzGbzZw/fx4PDw90Op3WcYQQQghRDoqikJOTQ0hICHr99e97WH0hcv78ecLDw7WOIYQQQohKSEhIICws7Lr7rb4Q8fDwANRvxNPTU+M0QgghhCgPo9FIeHi45ef49Vh9IXL5cYynp6cUIkIIIYSNuVmzCmmsKoQQQgjNSCEihBBCCM1IISKEEEIIzVh9G5HyMJvNFBcXax2j1nJ0dMRgMGgdQwghhA2y+UKkuLiYs2fPYjabtY5Sq3l7exMUFCRjvQghhKgQmy5EFEUhOTkZg8FAeHj4DQdMEdVDURTy8/NJTU0FIDg4WONEQgghbIlNFyKlpaXk5+cTEhKCm5ub1nFqLVdXVwBSU1OpW7euPKYRQghRbjZ9C8FkMgHg5OSkcRJxuRAsKSnROIkQQghbYtOFyGXSLkF7cg2EEEJUhl0UIkIIIYSwTRUuRDIyMmjYsCFxcXHlOn7btm20aNECf39/5syZU9GPE0IIIYQdq1Ahkp6ezrBhw8pdhKSlpTFixAjGjBnDH3/8wTfffMOWLVsqk1MIIYQQdqhChcjo0aMZPXp0uY//5ptvCA4O5tVXX6Vp06a89tprLFy4sMIh7VG/fv1YtGiR1jGEEELUIgXFJhIz8y1fF05GkZSSjMmsaJapQt13FyxYQKNGjZg6dWq5jj906BC33XabpSFjly5dmDFjxg3PKSoqoqioyLJuNBrLnU9RFApKTOU+viq5OhqkwaYQQgirdTzFyJB5v/9li8Ih58fw0uWTMX4rfg07aJKrQoVIo0aNKvTmRqORli1bWtY9PT1JSkq64TmzZs3i9ddfr9DnXFZQYqLlaxsrde6tinljMG5ON//jnDJlCp999hmgtp+ZOHEikydPplu3bsyfP5/g4GC2bt1K9+7d+eqrrywDhE2YMIEGDRrQpEkT3nzzTZ555hmefvrpav2ehBBC2K7CEhOn03IBWLLrHN9FJVj2OTvoCSYdL10+JYoBk3fFfr5XpWrtNePg4ICzs7Nl3cXFhfz8/BueM2PGDLKzsy1fCQkJNzze1sydO5fMzEx69uzJJ598QmZmJnPnzgVg3759dO/enYMHD+Ls7MyUKVPKnLtx40bmz5/PnDlzGDVqlAbphRBC2AJFUWj52gaGfriDoR/uKFOETB3YlBNv3cHWh/0BcAxsTl0fL62iVu/Iqr6+vqSlpVnWc3Jybjr4mLOzc5nipSJcHQ3EvDG4UufeKlfH8o0m6urqiqurKw4ODri5ueHt7W3ZFxYWxosvvohOp2PmzJlERkZSWlqKg4N6mc6cOcPJkyfx8tLuL4wQQgjrUlhi4mBCFua/tPP4alccl1edDHp83B3xdnXikwc70KSuh7ojJVp9DWpdw4nLqtZCJDIykm+//dayfvDgQUJDQ6vt83Q6Xbkej1irsLAwSzuT0NBQTCYTGRkZBAYGAjBu3DgpQoQQQmAyK0TFXSSvuJSnvjlw3faRdT2c2fPygGu3YUw5rL4G2kEhYjQacXV1xdHRscz2ESNG8NRTT7FlyxZ69+7Ne++9x+DB2tyxsDZ6vR5FKdtKOT4+HrPZjF6vJz4+HgcHB/z9/S373d3dazqmEEIIK/R/647x5c6zV22PCPSwLPt7OPHxmI7X70hxwY7uiLRt25Z58+Zd1W7B39+f999/n8GDB+Pl5YW7u7t0372kSZMmbNq0iSFDhnD06FFMJhPnz59n1qxZjB07ljfeeIORI0fKBHJCCCEAtd3H77HpJGYWlClC2oZ50cjfnffua4eDoZxNP4ty4eKl9whsUw1py69Shcjff5O/0QBnTz75JIMGDeLYsWP07dsXT0/Pynyk3Xn11VcZM2YMDRs2JDw8nH/+859069aNAwcO8M4779C9e3cWLFigdUwhhBBW4FRqLi+vPMLeuItltv82rS+NA+pU/A1TYwAF6gRBnYCqCVlJNdKgokmTJjRp0qQmPspmhIeHs2PHDsv6okWLcHZ2Zvny5dc8XgY/E0II+5RXVMq6w8nkFZdec79ZgTfXxljWezbxw6DXM6p9SOWKEICUI+qrxo9loIYKESGEEEJc21c7z/LeLyfLdezcB9pxV4ewW//Qy+1DNG6oClKIWI0JEyYwYcIErWMIIYSoQTtPpVuKkOZBHjT9S2PTvxvcKpBhbUOq5oMtXXe1bR8CUogIIYQQmvhmzzn+tSrasj62az3GdW9Q/R9sNsOFo+qy3BERQgghaof/7Ynn5IUcAE6n5fJ7bLpl35P9GjOyffWNs1VG5lkoyQODM/hp335TChEhhBCiGv127AILtp9hz9mL19y/aGIk/SLq1lygy+1D6rYAg/ZlgPYJhBBCCDt19Hw2jy6OKrPt6f7qXQi9Du5sG0zzoBoe1sLSY0b79iEghYgQQghR5U6n5fLx5lOsOnBlxvkpfRtzb6fQK3O9aMWKGqqCFCKaysnJYcyYMWzevBlPT0/WrFlDZGSk1rGEEEJU0t6zF/n89zP8GnOhzPY3R7Xm4W71NUr1N1bUdRekENHUokWLSE5O5tSpU2RnZ+Pr66t1JCGEEBVgMiv8e3U0Z9LyANh1OqPM/vs7hzG8XQi9m2o7eqlFQSZkJ6jLga20zXKJFCIaysjIoE2bNoSEhBASUkV9w4UQQtSYo+ezWbo7/qrtL93RnLZhXvRo7H+NszR0uduuVz1w9dY0ymX2VYgoCpTka/PZjm5wvRkO/2bZsmWMGTPGsr548WIiIiJ46aWXmD9/PsHBwWzdupXu3bvz1VdfERwcDKiDnjVo0IAmTZrw5ptv8swzz/D0009Xy7cjhBDixopKTYz7ci8AwV4uzLizBaDOgBsRpHE7kOtJsY4Zd//KvgqRknx4W6M7Cy+fByf3ch16zz33kJmZyezZs4mPj2f+/PkYDAZWrFjBvn37mDVrFvPmzWPq1KlMmTKFn376yXLuxo0b+eWXX5gzZw7t2rWrru9GCCHETXy1M46s/BIA2oR6MaKdDdzZvnCpx4yVtA8BeytEbISjoyPe3t64uLjg5OSEt7e3ZV9YWBgvvvgiOp2OmTNnEhkZSWlpKQ4O6qU6c+YMJ0+exMvLS6P0QgghAKKTsi3LH4zuoGGSCpA7ItXM0U29M6HVZ1eBsLAwdJce8YSGhmIymcjIyCAwMBCAcePGSREihBAa2xGbztrDyYA6IJmrk0HjROVgKoXUY+qylXTdBXsrRHS6cj8esVbx8fGYzWb0ej3x8fE4ODjg73+lsZO7u21/f0IIYQ8eWrjHsty1oZ+GSSog7RiYisCpDng30DqNhV7rAKKs8+fPM2vWLM6ePcsbb7zByJEjMRhsoNIWQohaorDEZFn+zz1tbONuCMDxn9XXBr1Abz0//q0niQCgW7duHDhwgPbt21NcXMzHH3+sdSQhhBCXFJea+T4qwbJ+f+dwDdNU0LHV6muLEdrm+Bv7ejRjY2bOnHnVNmdnZ5YvX37N4xctWlS9gYQQQlzX/vhM7vl0F4pyZZuunMM2aC7jtDqiqs4AEXdonaYMuSMihBBClMPkr/+0FCE6HSx4uJO2gSri2Br1tWFvcLOuUbzljogVmTBhAhMmTNA6hhBCiL9QFIXEzAJcHNXf3cd3r88rw1riaLCh3+UvFyIthmub4xqkEBFCCCFu4O2fj/H572ct6yPah9hWEZKdBElRgA6aD9M6zVVs6E9SCCGEqFklJnOZIqRduDctg21sLKfLd0PCu4JHkLZZrkHuiAghhBDXkJFbxKz1xy3rx94YYjtddf/qciHS0rp6y1wmhYgQQgjxN3lFpXR6a1OZbTZZhOSmQfwuddkK24eAFCJCCCFEGfnFpUT+35UipE2oF68MbaFholtwYh0oZghuD971tE5zTVKICCGEEJcoisLoBbvJL1ZHTx3YIpAvxnfWONUtiLk0iJmVPpYBaaxaK+Tk5DBs2DDc3NwICgpi3759WkcSQgir9Om20xxOVGfV7d7Ij08etJFZda+lIBPOblOXrWw01b+SQkQj/fr1q7GRUhctWkRycjKnTp1iy5Yt1KtnnbfnhBBCSwkX83lnwwkAGvm78+3j3XB2sMF2IZed3AjmUghoAf5NtU5zXfJophbIyMigTZs2hISEEBISonUcIYSwOoqi0PudLZb1ZZO7aZimilx+LGOljVQvs6s7IoqikF+Sr8mX8tfJB25gypQp6HQ6tm3bxsSJE9HpdEyZMoVFixbRpUsXRo4ciZeXF0OGDCE5Odly3oQJE5g5cyZLly4lIiKiXJPhLVu2DJ1Ox+uvv87ixYvR6XQ0b94coFo+TwghbNUPUYmW5Yk9G1DXw0XDNFUgN01tqApW3T4E7OyOSEFpAV3/11WTz94zdg9ujm43PW7u3LnMnj2bYcOGMXbsWMaOHYuzszPfffcd+/btY9asWcybN4+pU6cyZcoUfvrpJ8u5Gzdu5JdffmHOnDm0a9cOgFGjRrF169arPuett95i8uTJZGZmMnv2bOLj45k/fz4Gw5XbjJX5PCGEsCenUnNYdSCJT7actmx7dWhLDRNVkZWT1NfgdhDYWtssN2FXhYgtcHV1xdXVFQcHB9zc3PD29rbsCwsL48UXX0Sn0zFz5kwiIyMpLS3FwUG9TGfOnOHkyZN4eV0Z1e+zzz6joKDgqs/x9fXF0dERb29vXFxccHJyKvNZlf08IYSwJ2+uPca2k2mW9f+7qzV6vY3MqHs9BVkQt1Nd7v6MOkOfFbOrQsTVwZU9Y/do9tm3KiwszDKldGhoKCaTiYyMDAIDAwEYN27cVUXB5X019XlCCGFPsvKLARjUMpAuDX0ZE2kHjflP/AzmErWRatv7tE5zU3ZViOh0unI9HrEGer3+qnYl8fHxmM1m9Ho98fHxODg44O/vb9nv7u5epRlq+vOEEMKamM0Khy511X2oW336NAvQOFEViV6pvra6S9sc5WRXjVVtSZMmTdi0aRPJycls2rQJk8nE+fPnmTVrFmfPnuWNN95g5MiRZdp0VLWa/jwhhLAGO2LTeeqb/XSd9Ztlm38dZw0TVaH8i3DmUu8fKUTEjbz66qucO3eOhg0b8sQTT2A2m+nWrRsHDhygffv2FBcXV3tPlZr+PCGEsAYPLdzDuiPJpOUUARDZwIeWIZ4ap6oix9eqY4cEtoaAZlqnKRe7ejRjS8LDw9mxY4dlfdGiRTg7O7N8+fJrHn8rg5/NnDnzmtur6/OEEMJalZjMluUJPRrQOtSLoW2CNUxUxY6uUl9t5G4ISCEihBCiFvnwt1jL8kt3NMfF0Y4eR+dlwJlLQ7rbUCEij2asxIQJE645Hoi9fJ4QQmjtYl4xH20+BYCLox4ng539CDy2GhSTOnaIX2Ot05SbnV0FIYQQ4toe/OLK8A4bp/ax/fFC/s4GH8uAnTyaKe/w6qL6yDUQQlgrRVH4x7KDHEs2AvDK0BbU97Oz4QlyUyHud3W55ShNo1SUTd8RudzVtLi4WOMkIj8/HwBHR0eNkwghRFn/3XaGNYfOW9Yn9myoYZpqcmw1KGYI6Qi+tvX92fQdkcvDpKelpeHo6Iheb9N1lU1SFIX8/HxSU1Px9vaWcUiEEFbDZFaY8NVefo9NB6BdmBdLJ3XFYG+PZACibfOxDNh4IaLT6QgODubs2bOcO3dO6zi1mre3N0FBQVrHEEIIAIpLzdz2/lYSM9W5uPQ6WPxIFzxc7PCubU4KnLs0t0yrUZpGqQybLkQAnJycaNq0qTye0ZCjo6PcCRFCWI3Ptp1m1vrjlvX7O4cxc0Qr3Jxs/kfetcWsBhQIiwRv25srxy6uil6vx8XFResYQgghNGQyK2TkFpUpQu5oHcQ797bTMFUNOPK9+trqbm1zVJJdFCJCCCFqt8ISE6M+2cnxlBzLtrXP9KJ1qJ3PIJ70JyTuA70jtL5H6zSVIq07hRBC2LQSk5k318aUKUKGtg22/yIEYM9n6mvre8AjUNsslSR3RIQQQti0Bz/fw964i4A6Rsik3o00TlRDclIgeqW63HWytllugdwREUIIYbOyC0osRUiIlwvD2oZonKgGRX0F5hII7wqhHbVOU2lyR0QIIYRNOpGSwx+n1TFCQr1d2fnSbRonqkGlRRC1UF3uOkXbLLdIChEhhBA2IzOvmIMJWew+k8Fn289YtrcM8dQwlQaOroK8NPAIgRbDtU5zS6QQEUIIYTPGfbmXI0nZZba1DfPiEXsctv16zCZY86y6HPkoGGx7kDYpRIQQQtiEgmIT0efVIqRNqBduTgZeHdaydvSO+asTP0NpobrcaYKmUaqCFCJCCCFswum0XBQFfN2dWPNML63jaOfg/9TXlqPA3V/TKFVBes0IIYSwehfzivn36qMANKlbR+M0GspNhZMb1eX+L2ubpYpUqBCJjo4mMjISHx8fpk+fjqIoNz3n3XffJTAwEE9PT+655x4yMjIqHVYIIUTtYzIr3PPpLv48lwlA8yAPjRNp6MgPoJggtBMERGidpkqUuxApKipi+PDhdOrUiaioKGJiYli0aNENz9m+fTuLFy9m+/bt7N+/n8LCQqZNm3armYUQQtQi644kczY9D4A72wQxqVctGbDs7xQFDnyjLrcfq22WKlTuQmT9+vVkZ2czZ84cGjduzNtvv83ChQtveM7evXu58847iYiIoEmTJowZM4aTJ0/e8JyioiKMRmOZLyGEELVTVn4xzy47AECXBr7Mf7AT9fzcNE6lAbMZVjwKqUfB4GSzE9xdS7kbqx46dIhu3brh5qb+BWjbti0xMTE3PKd169Y8/fTTTJ48GQ8PDxYuXMjtt99+w3NmzZrF66+/Xt5YQggh7Mz3+xKISVZ/Cd19JoPLrQCeuq2Jhqk0Fvc7RK9Ql1sMBzdfbfNUoXIXIkajkYYNr/TT1ul0GAwGMjMz8fHxueY5Q4YMoWnTpjRpov7liYyM5KWXXrrh58yYMYPnn3++zOeGh4eXN6YQQggb9u3eeGasPFJmm6NBx9SBzejT1PZ7iFRa9HL11dkL7nxP2yxVrNyFiIODA87OzmW2ubi4kJ+ff91C5Pvvv+fcuXMcP36cgIAAXnjhBR566CFWrFhx3c9xdna+6nOEEELYv1KTmQ82xVrWn+7fBINex4j2ITQOqMU9ZfIyYP8SdfmuT+3qbghUoBDx9fUlOjq6zLacnBycnJyue863337LE088QUSE2rJ33rx5eHl5kZWVhbe3d+USCyGEsEu/HU8lxagO1PX7P/sT7lsL24Jcy8kNV5Yb2998OuVurBoZGcnu3bst63FxcRQVFeHre/3KrLS0lAsXLljWk5OTATCZTJXJKoQQwk4pisLLlx7JPNGvsRQhfxX7i/ra55/g6KptlmpQ7jsiffr0ITs7myVLljBu3Dhmz57NwIEDMRgMGI1GXF1dcXQsO959z549mTNnDmFhYbi6ujJv3jy6d++On59flX8jQgghrF+JycxrPx3lXEZeme3nMvLJyCsGYGyXelpEs06mEji9WV1uNljbLNWkQm1EFixYwNixY5k+fTomk4lt27YBag+aefPmMWrUqDLnTJ06lfPnz/Pmm2+Snp5O9+7db9rlVwghhP3acSqdb/fGX3e/k0Evd0P+KmEPFBnBzQ9COmidplrolPIMj/oXSUlJREVF0aNHDwICAqorl4XRaMTLy4vs7Gw8PWvZNM9CCGFHzGaFlv/eQGGJmd5N/bmvc9kekTqgS0NfAj1dtAlojX55FXZ9CG1Hw92faZ2mQsr787vCk96FhoYSGhp6S+GEEELUDkfPZzNj5RFyi0o5m55nGRNkTJd63NkmWNtwtiD2V/W16Y3H4LJlMvuuEEKIalFQbGLohzuu2t4ssA53tA7SIJGNyYqHtGOg00OTAVqnqTZSiAghhKgWX+06a1l+tFdDBrcKwqCHViFe6HQ6DZPZiMu9ZcK7guu1x+uyB1KICCGEqFKKojBj5RGW7UsAYNrtzXhmQFONU9mgk5cKkaaDtM1RzaQQEUIIUWVMZoWV+xMtRUi7cG+e7F+L54iprJICOLtdXbbTbruXSSEihBCiSqw5dJ5p3x+i2GQGYGLPBrx8ZwsMenkMU2FxO6C0ADxDoW5LrdNUKylEhBBCVIkvd561FCE9GvvxytCWUoRUVuxfHsvYeXsaKUSEEELcsuikbA7EZ6HTweZp/Wjg5yYNUitLUeDkRnXZztuHgBQiQgghbsHFvGKW7YvnnQ0nAIhs4EtDf3eNU9m49FjIOgcGJ2jUV+s01U4KESGEEJXy57lM7vl0V5ltj/VupFEaOxJ76W5Ig17gZP9FnRQiQgghbiguPc8yId1lZkXhvv/+YVlvFliHpY92pa4Mz37rLO1D7Lu3zGVSiAghhLiunafSefCLPTc8ZumjXenV1L+GEtm5QiOcu3SXyY6Hdf8rKUSEEEJc5VRqDvEX8/k1JhUAdycD/h7OZY7R63Q82quhFCFV6cwWMJeCXxPwa6x1mhohhYgQQghAnR1395kMjp438n8/Hyuz766Oobw1qo1GyWqR2NoxmupfSSEihBC1nKIo7DiVzqdbT7PrdEaZfW3DvHB1NPBA53oapatFzOa/zLYrhYgQQohaYuPRFKYs3Q+Ag15Hh3reODnoebp/U7o39tM4XS2SchhyL4BTHajfQ+s0NUYKESGEqKVKTGbWHU5m6ncHLdsWToikb7MA7ULVZpcfyzTqBw7ONzzUnkghIoQQtVBhiYmJX+3jjzNXHsV8NVGKEE3VwvYhAHqtAwghhKh5Px5IKlOEvHNvW/pH1NUwUS2Xlw6JUepyLem2e5ncERFCiFqm1GTmrXVXesXseLE/YT5uGiYSnPoNUCCoDXiGaJ2mRskdESGEqGV+Onie3KJSAJ6/vZkUIdYgtvZMcvd3UogIIUQtEpeex7QfDgHg6+7EQ93qa5xIYCq9dEeEWjOs+19JISKEELXIx1tOWZbfu68tvu5OGqYRACTug8IscPWBsM5ap6lxUogIIUQtEn8xH4BeTfzp10wap1qFy49lmgwEvUHbLBqQQkQIIWqJi3nF7D17EYBnBzZFr9dpnEgAcPxn9bXZEG1zaER6zQghhJ1be/g8y/YmsONUumVbQ393DRMJi/RYSD8Besda1233MilEhBDCjhWXmnnlx2iy8kss28Z2rYd/ndozcqdVO75OfW3YG1y8tM2iESlEhBDCjv3fuhiy8ksI8HDm1WEt8XBxoE9TGT3VauyYo742H6ptDg1JISKEEHbKZFb48eB5AIa2CWZEu9o1UJbVS9oPhdmADiLu1DqNZqQQEUIIO7TleCqPLt6HWVHXX7qjubaBxNX++ER9rd+j1o2m+lfSa0YIIezQ0t3nLEXI2K71cHGsfd1CrVp2IhxdpS4Pma1tFo3JHREhhLBDJ1NzAHhtWEvGdZfRU63Ons9AMUHDPhDcVus0mpJCRAghbJiiKJgu3/oADidlM37hXnIuzSUzqkMoDga5+W1VinLgz8Xqcventc1iBaQQEUIIG5WRW8So+TtJuFhwzf2d6vvIEO7W6MBSKMoGv6bQpHaOHfJXUogIIYSNWrjj7DWLEP86Tix5pCvNgzw0SCVuyGyC3fPV5e5Pgl7uVkkhIoQQNuhUag7/3XYagA/HdKDvX8YGcXc2yOMYa3V8LWTFg6svtB2tdRqrIIWIEELYmE+3nuY/G44D0DzIg2FtgmXeGFtxuctu5KPg5KZtFishJbMQQtiYn48kW5Zn3NlCihBbkbAPEvaAwQkiH9M6jdWQOyJCCGFDcgpLOJKUDcAfM24j2MtV40Si3HZfuhvS5j7wCNQ2ixWROyJCCGFDnvn2AAAhXi5ShNgSYzLE/KQud3tS2yxWRgoRIYSwEafTctl6Ig2A0V3qaZxGVMipX0ExQ2hnCGqtdRqrIoWIEELYiA3RKZblfwxoqmESUWGnNqmvTWXckL+TNiJCCGHFMvOK2R6bRm5RKe9uPAHAQ93kbohNMZXC6a3qcpOBmkaxRlKICCGEFXvym/38cSbDsh7k6cK47g20CyQqLulPdSRVVx8I6aB1GqsjhYgQQlipfXEX+eNMBo4GHd0a+dHQ353pgyPwcHHUOpqoiMuPZRr1B73Mgvx3UogIIYSVmr/lFAD3dgpj1t21e4ZWm3a5EJHHMtckhYgQQliJolIT3+6JJzO/hMISE1tOpKHXwZS+jbWOJirLeB7O71eXmwzQNouVkkJECCGsxJpDycxcE1Nm27C2IdT3c9cokbhlm15XX8O7gUeQtlmslBQiQghhBRIu5vPCD4cAaBXiSYd63rg6GnisTyONk4lKKylQJ7kDaDlS2yxWTAoRIYTQWMLFfHq/s8Wy/lC3+oyRActs34n1UJyrLkc+qm0WKyYDmgkhhMbmbz1lWW4d6sldHUI1TCOqzJHl6muv58HBWdssVkwKESGE0NjlSex6N/Vn+ZQeuDhKF0+bl38RYn9Rl9ver20WKyeFiBBCaKSwxMT0Hw4RnWQE4O272kgRYi9WPwPmEghsA3VbaJ3GqkkbESGE0Mh9//3Dcjck0NOZMB+ZTdcuFOVA7K/qstwNuSkpRIQQooYs2xvPD38moigKGXnFnMvIv7Lv8e7odDoN04kqE/srmIrA0Q16PKN1GqsnhYgQQtSA9Nwi/r36KEWl5qv2HZk5SIZttyfH1qivXR4DKS5vqkKFSHR0NBMnTuTUqVNMmjSJd955p9wV/OjRowkICOCjjz6qVFAhhLBVpSYzIz7aQVGpmVYhnjw7oKllX4d6PlKE2JOSwiuNVFvI2CHlUe7GqkVFRQwfPpxOnToRFRVFTEwMixYtKte5GzduZPPmzbz55puVzSmEEDbr6Hkj57MLAXj+9mYMahVk+QrwkG6dduX4WnXsEM9QmWm3nMp9R2T9+vVkZ2czZ84c3NzcePvtt3nqqaeYOHHiDc8rKCjgySefZPbs2Xh7e9/0c4qKiigqKrKsG43G8kYUQgirYSwsYdzCvSRczKf40uMY/zpODGgRqHEyUW1KCmDFpYHLWgwHvXRMLY9yFyKHDh2iW7duuLm5AdC2bVtiYmJucha8+eabFBQU4ODgwObNm+nfv/8NH+fMmjWL119/vbyxhBDCahw9n81z3x3kfFYhuUWlV+0f27W+BqlEjdn/9ZXlzjKSanmVuxAxGo00bNjQsq7T6TAYDGRmZuLj43PNc+Lj45kzZw5dunQhPj6eDz74gHr16rFy5crrFiMzZszg+eefL/O54eHh5Y0phBCaiM/IZ/yX+0jPLSqzfXz3+oztWh8nBz0N/Nw0SieqXWkx7PxAXR76PgQ00zaPDSl3IeLg4ICzc9lnmS4uLuTn51+3EFm0aBGBgYH8+uuvODs78+yzz1K/fn1+/fVXBg0adM1znJ2dr/ocIYSwZkWlJiZ8tZf03CJaBHvy0Zj2OBr0uDgaCPR00TqeqAmHvwNjItQJgvYPaZ3GppS7EPH19SU6OrrMtpycHJycnK57TmJiIgMGDLAUFh4eHjRt2pSzZ89WMq4QQliPUpOZrIIS1hw6z5n0PAI8nFk8MZK6UnzULqZS2DFHXe7xNDjK9a+IchcikZGRfPHFF5b1uLg4ioqK8PX1ve454eHhZdqRmM1mEhMTqV9fnpMKIWyX2ayQkJnP8I92YCy80hZkSt/GUoTURjE/wsUz4OoDnW7cgUNcrdxNevv06UN2djZLliwBYPbs2QwcOBCDwYDRaKSkpOSqc+6//37WrFnDihUrSExMZMaMGRQVFdGzZ8+q+w6EEKIG5ReXcueHv9P33a1lipAWwZ6M6SLt2Wodsxl+f19d7vYUONfRNo8NqlAbkQULFjB27FimT5+OyWRi27ZtgNqDZt68eYwaNarMOREREXz33Xe88sorHD9+nMaNG/PTTz/h4eFRpd+EEELUhOMpRkZ+vLPM6KiT+zZixh0yqVmtdWYLpMaAk4c6kqqoMJ2iKEpFTkhKSiIqKooePXoQEBBQXbksjEYjXl5eZGdn4+npWe2fJ4QQ17Lm0Hme+faAZX1Qy0D++1An9HoZwrtW+2EiHF0JkY/B0Pe0TmNVyvvzu8JzzYSGhhIaGnpL4YQQwtZ8uzfesvzfhzoxpHWQhmmEVci/eGVemY4Pa5vFhsmkd0IIcRPbTqax63QGAL//sz/hvjIeiAC+HQ3mEghqA8HttE5js2T8WSGEuIHopGzGf7kXgI71vKUIEaq8dEjYoy6HdtI2i42TQkQIIa6jsMTE898ftKy/MDhCuzDCuqybdmV50Fva5bADUogIIcR1fLQ5lpMXcgG1XUiPxv4aJxJWIfW4OnYIwOhvwVl6gt4KKUSEEOIaSkxmvtuXAEC7cG8GtKircSJhNeJ3qa86PTS/U9ssdkAaqwohxF8oisKPB5P481wm6bnF+NdxZvmU7jga5Pc2ccnJX9TXvi9pm8NOSCEihBB/8XtsOs99d8iyfk/HUClCxBUFWXBqk7rccoSmUeyFFCJCCHFJfEY+479Se8hEBHrQo4kfT/RrrHEqYVVO/Kx22Q1oAXVlRN2qIIWIEKJWSckuZNGuOApLTFftW7QrzrI8uW8j7u4YVoPJhE04ukp9bXWXtjnsiBQiQohaZe6vJ/kuKuGGxzzaqyHD24XUUCJhMwoy4fRmdbnVKE2j2BMpRIQQtYaiKGw9mQrA/Z3DqOvhctUxkQ196dus+ufREjbo+Dowl0LdVhAgY8pUFSlEhBC1xokLOVwwFuHiqOeNka1xcTRoHUnYkqM/qq8tR2oaw95IU3AhRK3x1tpjAHRv5CdFiKiY+N1w6ldAB63v1jqNXZFCRAhRK5jNCvviLgLQs4mMkCoqwGyG9S+qyx0fBv+m2uaxM/JoRghhl/KLS3nhh0OkZBcCYDIrFJWaAXioW30towlbs/FlSD4ITh5w26tap7E7UogIIexKcnYBL/xwiJ2nMq65v22YlzyWEeWnKHDwG3W562SoI0P9VzUpRIQQdsNsVnj1x6NlipCIQA+mDWoGgE6no2M9b43SCZuUcgSKjOpy72k3PlZUihQiQgi7YDYrvLzqCJuOXQDglaEtaBPqRcf6PjJEu6i8rbPU19b3gJObtlnslBQiQgibl55bxMiPd5KUVYBeBx+M7iADkolbl/SnOqS7Tg/9Zmidxm7JrwlCCJs3e/1xkrIKAHj33nZShIhbZyqFZQ+qy20fkJ4y1UjuiAghbJbJrKAoCsdT1Gf4Het5c08nmR9GVIFjqyEnWV3uM13bLHZOChEhhE16Y00MX+48W2bb5+M6a5RG2JVja2Htc+pym/vBT2Zgrk5SiAghbM6WE6lXFSGj2ofgV8dZo0TCbsRugu8uPZIJaAF3vqNtnlpAChEhhE3Jzi/hpRWHAZjQowHPDWwGOvByddQ4mbB5xmT49oEr6+PXgKuPdnlqCSlEhBA25Y21MVwwFtHI350XhzTH1UkGJxNVJHajOrsuwBN/QB2ZhbkmSK8ZIYTN2BRzgRX7E9Hp4N372koRIqpW7K/qa/9/QWBLbbPUIlKICCFsQlZ+MTNWHQHgsd6N6FTfV+NEwq5ciIHja9XliDu0zVLLyKMZIYRVKzGZOZiQxZtrY0jLKaJxgDvP395M61jC3uz5VH2t2xKC2mibpZaRQkQIYbUURWHcwr38cebK3DH/Ht5KJq0TVas4D6JXqssygmqNk0czQgirNXv98TJFyH2dwujVxF/DRMIuxfwExbng2whaDNc6Ta0jd0SEEFZFURR2nspg64lUvtihjhXSq4k/X4zvLHdCRPU4sFR9bf8g6HTaZqmFpBARQmim1GRm8/FUMvKKLdt2nkpn7eFky/rLdzbn8T4ysqWoJhmn4dxOdWK7dmO0TlMrSSEihKhx2QUl/HwkmS3HU/kl5sJV+w16HT0a+zGkdRAPdq2vQcLaIbMwk1JzKd7O3vxw8gd6hfainmc9rWPVrIPfqK+NB4BXqLZZaikpRIQQNe6j32Itj130OriteV10l26JOznoebBrPXo0lrYgN2NWzHwd8zWhdUIZWH/gdY87n3ue2MxY+oT14WLhRdacXsP7f75/zWOD3YOZ2nEqdza6s7piW5cTG9TXdqO1zVGLSSEihKhRaTlFliLEoNfx+bhO3NY8UONUtum3+N94L+o9dOh4t++7DG4w+KpjzIqZyb9OJs4Yx+S2k8kszOT7k99f9z2T85J5deer9AnrQx2nOtUZX3tZ8ZB6VF2u30PbLLWYFCJCiBqRcDGf7/YlsHDHlcnq1jzdi5Yhnhqmsk2rT6/mw/0fciFffayloDDj9xn4ufjROUidgTizMJMdSTv45OAnJOUmAfDZ4c+u+X7ezt5kFWVZ1ovNxSyMXsgzHZ5Br7PjzpUb/6W+egSrX0ITdvw3TAhhLcxmhSe/2c/HW05RUGIC4NkBTaUIqaRPD35qKUIAeof2psRcwj+2/INTmacA+PjAx7y842VLEXItLf1asnLESn4f/TtHxh9h34P7mNNvDgBfHPmCYauGkV+SX73fjFZy0+DkpccyfaZLbxkNyR0RIUS1W3UgiSNJ2dRxdmB0ZDg9m/rTP6Ku1rFsUmZhJom5iZb1R1s/ypR2U3jsl8c4mHaQu1bfRSu/VhzNOFrmvE33buI/+/7Dr+fU+VT+GPPHVY9eXBxcGFhvII56R0rMJSTkJDBhwwTcHN0YWG8gD7Z40NKWp7yKTEXsPr+byKBI3BzdKvldV4MDX4OpGEI7QeSjWqep1XSKoihah7gRo9GIl5cX2dnZeHrKb09C2Jr84lL6v7eVC8YiXrqjOVP6SlfcilAUBQUFvU5PekE6/b/vb9n3yYBP6B7SHUe9I1mFWTy8/mHijHFlzvdw8uClLi8xovEIFEUhIScBf1f/GxYFR9OPMnrd1Y03RzYeyWvdX8PJ4HTT3Ik5iRy7eIzntz4PQF23uqwcsRIvZy+MxUZcHVxx1DuW80+hiplN8EF7yI6HUZ9C+7Ha5LBz5f35LYWIEKJKFRSbmL3+GKk5RQCkGAs5EJ9FuK8rm57vi7ODDEpWER/u/5Clx5YyodUEFh9dTH6p+qhkZOORvNXrrTLHJuYkMn7DeFLzUwFwd3Rn5+idGPSV+zNfe2YtM34vO+R5x7odmdt/Lr4uV086mFeSx46kHbT0bclD6x/iYuHFMvtb+rVkRpcZPLz+YZp4N2Hh4IXXfJ8bURSFUqX01oqYExvg2wfA1QeePwaOrpV/L3FdUogIIWpc7IUc7vvsD7LyS67a9+mDHbmjjTQIvJmC0gJcHdQfjMm5ydy58k5KldKrjjsy/sg1zy8yFVFYWsiu87vwd/UnMijylvJ8evBT5h+az8B6A9mTvIeckhxC3EP4aMBHNPNpRom5xFIU9PhfD3JKcq75Pjp0KJT9cdPctzkLBy/E06n8/7c/t+U5DqQeYOmdSwnzCKvcN/XNfRD7C/T4Bwx6s3LvIW5KChEhRI3KKypl+Ec7OJOeB6hjg/SPCAAg2MuVgS2li+715BTnsO7MOo5fPM6K2BV0DerKzB4zWRKzhG+Pf0sjr0akF6RjLDYCsHDQQroEd6mxfNlF2Xg5e3Em+wzP/PYM8TnxuDm44eHkwYX8C4S4h+Du5E5sZmyZ8xz1jgxvPJzXe7xObGYsd6+++6r3bhvQls9v/9zyqCi9IJ1pW6cxoN4AHm75cJk2KSXmEros7UKpUsrt9W+3NKytkLwMeK8pKCZ4+k/wb1Lx9xDlIoWIEKJGTfv+ECv2J1LH2YG3727D8LbBFW7YWFu9H/U+i44uKrPN1cEVk9lEsbmYLwZ9QXPf5mQVZVHfU9uRZrOLsnl+6/PsTdl73WOe6fAMzX2b0yesT5ntfy1GPr5N7dVjLDbSJagLnwz4BGeDM22XtLUc/1yn53ik9SMApOan8tmhz8qMgfLl4C+JDIq0FGmOekeKTcU09r5BO6SoL2HtcxDcDiZvr8wfgSgnKUSEEDXibHoejy2J4lRqLnodfPtYN7o28tM6liYURWF38m5C64RSz7MeJeYSHHQOloIs3hjP0Yyj9Anrg7ujO8B1G5le1ta/LUvvXGpVRV2JuYRZe2bxw8kfrtr3bMdnmdRmUrne50jaESb9Mon80nz6hPVhYquJTNw4scwxL3d9mbT8ND4/8vk13+OZDs+w/ux6TmWdsmzbcM8GQutcZ7j2RcMg7ncY+Dr0mlqunKJypBARQtSIF344xPI/1e6kzw1sxrMDm2qcSDsf7P+AL458gQ4dbQLacDjtMG382/Bu33f56MBHrDuzDlAbkY5qMooNZzeQUZhR5j3qedTj4wEfs+v8LjbGbeTFyBdp5d9Ki2/nhhRF4djFY4R7hGPQGUjOS0ZRFBp6NaxQ49iolCie2PQEhaZCy7b6nvXpGtT1uiPAdgnqcsM7Mg+1eIgXu7x49Y5ja+G7B9XlZw+Dj8xjVJ2kEBFCVDtjYQld/+83CkpMvHxncx7r3ciqfnOvSlmFWXx04CPLD8dB9QfhaHCknkc9Hmv7GLd9f1uZ0Ukrys3BjZ1jduKgr33DO+1M2smUTVMs68uGLqOFXwte3P4iG+I2WLa7GFxoE9CGqR2ncjrrNK/teu267zml3RQeb/M4joZLvWsUBT7pAuknIaQDPL61ur4dcYkUIkKIapVfXEqfd7aQnltMk7p1+PW5PnZbhAC0WdzmuvsaezXmdPZpAJ5q/xS317+dxUcXs+rUqquOHddyHD1DevL1sa/ZkbQDgE6BnZjUZhK9QntVT3gbsP7sev65/Z/AlR5BxaZifjz1I0tilpCan8qKESsI9wi3nJNfks/EjROJyYihV2gvJrWZxMxdMy2PuZp4N+GLQV/g5+oHZ7fD4uHqiU9HgX/tvXNXU6QQEUJUq+k/HOKHS49kZt3dhjFd7Hf6+A1xG5i+bfpNj3NzcGP32N1lCrLC0kLe3P0mq0+vZlD9Qbzf78qst2n5abg6uNr/5HLllJKXgqeT51WDrZWYSygxlVxzELaUvBQWH13MfRH30cirEYuPLua9qPfKHLN/+E84fthBXen8CAybW23fg7hCChEhRLWZtDiKTccuoNPB3PvbM7J9iN3eDYlKiSrTgPLI+CMk5CSAAsZiI8l5yby26zX0Oj0rhq8g0P3qbsqKopCUm0Swe3ClBxcT5VNiKmHSL5PYn7rfsu32YpiTFK+uTNkJQa01Sle7lPfnd+17GCmEuCWnUnPZdEydcG1yn8aM6nCd3gl24MTFE2WKkP/0/g9AmccDrfxb0SOkBwWlBeojgGvQ6XSVH3xLVIijwZHFdyzGWGyk57c9AfjVCZZ7uBPefgJdpQixOjL7rhCi3HIKS/h8+xnL+otDIjRMU30uFl6k1FzKvP3zLNs+u/0z7mx05zWPd3N0u24RIrTh6eTJ//W4Mmrq6/5+TEpcw8rYlSTnJmuYTPyd3BERQpTLB5ti+XBzLCaz+jT3f491tcnHMUfSjvDB/g8I9wynU2AnOgd2Jsg9CIBScyl7kvfw1G9PEe4RTnyOejt/fMvxdA/urmVsUQnDjdnEZWXzubeXZdu/d/0bULsAfzrw03JN4Ceql7QREULc1Pytp3hnwwnL+oDmdflifGebLESe3fwsmxM2l9kWWieUzoGd2ZywmZzisnOldA7szFdDvqrJiKKqfPcwpmOrGVS/HqnXuP9/T9N7mNljZo3Hqi3K+/NbHs0IIW5o8a44SxHy4pDmxM0eysIJkTZZhJSYStiTsgeAEY1H0MqvFXqdnqTcJH46/VOZIsTb2Ru9Ts/E1hOv93bCmuWlw7HVGICf+n3Mtge2XTU8/orYFVj57+K1gjyaEUJc5WJeMWfScvkhKpHvohIA+MdtTXii3w3m8LASxy8e57Wdr9HQqyGH0w7TNbgrU9pNIcg9iE8PfUpeSR6+Lr682fNN9Do9eSV5HEw9SNSFKA6kHuBg6kEigyKZ3Xs2zgZn6Vprq9ZNU19dfagT3h0cnFh711qOZhxl9NrRlsOiLkTd8gzF4tZU6NFMdHQ0EydO5NSpU0yaNIl33nmn3L8VlZSU0LFjRz766CP69etX7oDyaEaImqMoCvviMrn/sz/KbH+qf2NeGBRh9XdBrjfDq7PBmQdbPMiX0V8C6vTzPwy/ep4UYSdifoLvx6nL436CRv3K7P77WCNNfZoyf8B8S1shUTWq/NFMUVERw4cPp1OnTkRFRRETE8OiRYvKHeidd94hOjq63McLIWremsPJZYqQrg19WfFEd6YPbm7VRUhqfiptFrcpU4T4OPtYlotMRZYiBOAfHf5Ro/lEDTKVwi+vqsu9X7iqCAEY32o8y4cvt6zHZsby3Jbnaiig+LtyP5pZv3492dnZzJkzBzc3N95++22eeuopJk68+fPT2NhY3nvvPRo0aHArWYUQ1SinsIQ31hy1rL93Xzvu7WS9Y18cTT/K1sStjGg8gic3PWnZHuIewueDPifcIxxjsREPJw+2J25n3p/zOJ19mmD3YHqH9dYwuahWR1dC1jlw84Pe0657WIRv2a7n0RnRmBUzep00naxp5S5EDh06RLdu3XBzU4fYbdu2LTExMeU6d/Lkybz00kusX7/+pscWFRVRVFRkWTcajeWNKIS4Bc9/f4j03GIAPh/XmdtbXj1CqLXIKMjgiU1PkFmUyeeHP8ekmCz7Fg1ZRHCdYAC8nNVum/3C+9ErtBfbE7fTwLOBFpFFTTCbYcel4du7PQFOVw8J/1fLhi5j9Lor7UX2peyja3DX6kworqHcpZ/RaKRhw4aWdZ1Oh8FgIDMz84bnffXVV2RnZzNt2vUr07+aNWsWXl5elq/w8PCbnySEuCWxF3L4NUYdLXVgi7r0bRagcaLrUxSF/9vzf2QWZVLHsY6lCNHr9Pz50J+WIuTvHPQO3FbvNhp5N6rJuKImndwAqTHg5AGRj9308Fb+rbiv2X2W9Um/TOL+NfdjVszVmVL8TbnviDg4OODs7Fxmm4uLC/n5+fj4+FzznLS0NGbMmMGGDRtwcCjfR82YMYPnn3/esm40GqUYEaKa/HE6g+MpRjYfTwVgSKsg/vtwJ41T3diGuA38eu5XHHQOfDXkKwpLC1l+cjk9QnrI4FS12d7P4ecX1OXIR8HVu1ynvdb9NYY2GsqEDRMAOHbxGO2WtLPsfyDiAf7V9V9W3UbK1pW7EPH19b2qsWlOTg5OTtf/hz916lQeffRR2rdvX+5Azs7OVxU8Qoiql5JdyJjPd5fZ9nhf675bkF6Qzv/t+T8AHm/7OM19mwPQvm57DVMJzeWkXClCALo9ef1jr6Fj3Y7X3ffdie8YUG8A3UNkZN3qUu5HM5GRkezefeU/rbi4OIqKivD19b3uOf/73//46KOP8Pb2xtvbmx07djBs2DBmz559a6mFEJVmMius+DORu+bvtGwb3i6EV4a2oGO9a9/d1FphaSGKovDaztfILsqmuW9zJrWdpHUsYQ1O/QbvX2p4qneEJ3eDR8XaN+l0OlaNWIWLweWa+x//9XE6fd2JYlPxraYV11DucURKS0sJCQnhvffeY9y4cUyZMoWkpCTWrFmD0WjE1dUVR0fHMufExcWVWR89ejRTp05lyJAheHt7lyugjCMiRNUxmxVeWnmY76MSAdDr4IPRHRjeLkTjZNd2zniOYauGXbV9+fDlV/V6ELVQVgL8txcUZoHOoBYhAc0q/XYms4l5++cR5B7E6IjRbIrfxAvbrtxp6R7cnVe6vUI9z3pVEN7+lffnd4UGNPvxxx8ZO3YsHh4emEwmtm3bRqtWrWjQoAHz5s1j1KhRNzy/X79+zJw5UwY0E6KGJVzMZ+mec5y6kMtvl9qDDG0TzKTeDemgwV2Q7KJsdibtpH+9/rg6uF61P6Mgg/ySfB755RFS8lLK7OsX1o+PBnxUU1GFtSo0woK+cPEMBDSHievB7fp36Cur6zddyS/NL7Pt4ZYP88/If1b5Z9mbailEAJKSkoiKiqJHjx4EBFR/y3opRIS4dT1nbyYpqwAAnQ7ev68dd3es+TFC8kvycXN04/U/Xmf5yeUYdAZa+bfCx9mHhl4NaejVkLT8NOYfmn9Vz4UInwiKzcWsHLESB73MTlHrrZoCh74FZ0+YvA18q6d9U25xLpN/nczh9MNlth8ed1gasN5EeX9+V/hfc2hoKKGhobcUTghRczJyiyxFSPMgD14b3pIejf1rPMeH+z/k8yOfl9lmUkwcTlP/g9+WuO2qcwLdAllyxxJC6ljnoyOhkcQ/1SIEYNT8aitCAOo41eGbod9wJvsMI38cadl+MvOkPB6sIvJrhRB27ucjyYDaHmTdP3pj0Nf8b3Fnss6UGWL9r5p4N2F0xGjOGs9yNvss6QXp3NXkLnqE9sDPxc8yKJkQACgKbHhJXW43FloMr5GPbeTViLd6vsUrO18BYGPcRiJ8I0jOTcbT2RN3R/cayWGPpBARws79dPA8AC/f2UKTIgTgvaj3MCkmOtbtiKPekcTcRB5p/QgD6g3A08kTR4Pjzd9ECLMZfnkFEveCoxsMeK1GP35kk5E46h158fcX+fzI52Xu8G25fwv+rjV/p9EeSCEihB1Lyiog6lwmOh0Ma1v9jzcURWHn+Z3M+3MejnpHInwj8HL24vek33HQO/BGzzeo71m/2nMIO2QqheUT4Ngadb3X8+B57VF0q1Pf8L7X3N7/+/7sf2i/FNWVIIWIEHbqky2nWPGn2k23a0NfgryuPUZCVXov6j2WxCyxrEdnXBkEcUzzMVKEiMo5sBR+eurKeosR0ONpTaLc6BHM2jNruavpXTWYxj5IISKEnVl96DyfbD7FiQs5lm33dar+aRK2JWwrU4SMbzkeJ4MTJzJP4KBzYEq7KdWeQdih7MSyRcjdX0Db+65/fA14vcfr/HvXvwEYHTGaZSeWAbAweiEjGo/AoDdoGc/mSCEihJ2Zv6VsEfLtY93o1qjqx1e47GDqQR5e/7BlfUzzMTzb8VlpvCduXcxq+P7K3y2eP67J45i/u7vp3QS6BRLgFkAzn2YMaTiECRsmcM54jl/O/cIdDe/QOqJNKfcQ70II66coCvEX1cGX3ruvHVGvDKR7Y79qHe9g4ZGFluUWvi14ofMLUoSIW3fuD1hxaRh/nR7u/9oqipDLeob2pJmPOoprp8BOPNlend/m8yOfy+y9FSR3RISwUdkFJTz/3UEOJmRZtilAfrEJnQ6GtwvG2aF6bxH/du43tiZuBaB9QHtm95ktM+CKW5d2Ar4dDaYiiLhTLUIM1v3jamzzsSw+upjYzFhG/jiS74Z9h5ujm9axbILcERHCBhWXmpny9Z/8djyVjLxiy9fFPHVSro71fKq9CNmdvJupW6cC0KFuB76+82tC68hgh+IWZMXDhpfhky7q/DFhkXDPQqsvQgC8nL14IOIBAOKMcczbP0/bQDbE+q+uELVcicnMsn0JfLAplqx8tdAwKwpmBdydDHz6UCcCPcv2iGnoX72PRi4P0X7ZU+2fusHRQpTDuT/g67ugVB0FGPe6MOY7cLKduwrjWo6zDNz327nfeLnryxonsg1SiAhhpYpKTUz7/hBrDydfc7+HswMfP9iRPs2qf86nvzqaftRShAS5B7F61OprTlwnRLklH4L/3a8WIX5NISACRnxULZPYVSc/Vz8WDVnEhA0TSC1IJSEngXCP6u+xZuukEBHCCu2Lu8h9//3Dsu7uZOCFwRHc0TqYy+1OPV0ccXWquW6C2xO389mhz8gtybVs+3Lwl1KEiFuTHgtf3w1FRqjXAx5aYVN3Qf6uU2AnugR1YW/KXjbHb2Z8q/FaR7J6UogIYUUuGAspMZktA5EBzLijORN7NsTJoWaadKXmp/LJwU9wMbjwUpeX0Ol07EraxdQtUykxl1iO+3zQ5/Lbnrg1WQmwZBTkp0NwOxi7zKaLkMsG1h/I3pS9vBf1Hu0C2tG+bnutI1k1KUSE0JCiKCRmFlBsMjPn15Os+9tjmPfua8e9ncJqLM+2hG08vfnKiJWdAjuRUZjBO3vfoVQppUdIDxRFoZlPM7oFd6uxXMIO5abB16PAmKg+jnloJbjYxwSHt4Xfxtt73gZgwoYJHBx3UNtAVk4KESE09MqP0XyzJ/6q7c4OesJ8XBnQvG6NZTmTfaZMEQIwbds0y3Kv0F582P9DmUtD3LrCbFh6N2ScAq9wGPcjuNvPhHGB7oE082nGycyTmBQTGQUZ+Ln6aR3LakkhIkQNis/IJy23CICEi/llihAvV0daBnuy+JEuNfYY5jJFUZi+bbpl/cl2T7IkZomlPUj34O7M7TdXihBx6+L3wA/jIScZ3ANg3E/gVXN3/WrK98O+Z/S60Ry/eJyfTv/EI60f0TqS1ZJCRIgasiM2nXFf7sGsXL3v0GuD8HKr+R/yi48uBtTf4E5mngSgZ0hPHmnzCIMaDOJk5km6BHXB18W3WkdnFbWE8Tx8OUhddnCFh1eBX2NtM1UTg97AiMYjOH7xOHP/nEtb/7Z0DuqsdSyrpFMU5Rr/LVoPo9GIl5cX2dnZeHp6ah1HiErJzi9h8LztpBgLCfBwxu1SbxdXRwPv3NuWtmHeNZYlvySfL458wcG0g+xL2Vdm30MtHuLFLi/WWBZRi2QnwaKhkHlWXX9yN9RtoW2mapaWn8ZtP9xmWd//0P5adVexvD+/5Y6IENXkQHwmydmFAPx4IIkUYyEN/d1Z949euDnV/D89RVEoNhfz7JZn2Z28+6r9jnpHHmr5UI3nErVAdiIsGqYWIZ5hMHqp3RchAAFuAZauvAA/n/2ZkU1GapzK+kghIkQVi07K5vPfz/DTwfNltut18P797TQpQj7Y/wFfHPkCXxdfLhZetGz3dfFl4aCFZBdn4+rgKkO0i6qXnXjpTkgc+DSA8WvBu/Z0+15w+wLaf90egOMXjzMSKUT+TgoRIapIUlYBn207zZI/zlm2darvg0GnAx3c1SGUjvV8ajxXQWkBXxz5AoCLhRdxNjjz6cBP6VC3Aw56+S9AVJOCTFgyUh01FdQiZMI6u2yYeiMGvYE3erzBa7te488Lf2odxyrJ/0JC3KKcwhLmbz3NlzvOUlSqTv/dKsSTZ25rypDWQRqnU8cGuezlri/TJagLjb3ts4GgsAL5F+H39+HczitFiH8ztWFqLStCLusd1huAYxePkVmYiY9Lzf9CYs2kEBHiFs359SRf7YwDoGWwJ+N71Of+zuGa9TJJyk3iUOohgtyDMCkmfj77MwCT2kxiTPMxmmQStUBxPqx9Dk6uV8cJuezO96DzI6CvuekIrI2/qz9NfZoSmxnLwiMLeSHyBa0jWRUpRIS4BaUmM2sOqW1BJvVqyL+GttC8m+vMXTOv2Rj1zoZ3apBG1AppJ+D78ZB2TF2vEwS9p4FvQ2h6u7bZrESoeyixmbEsjlnM5HaT8XDy0DqS1ZBCRIhK2nz8AuuPpJCeW4yPmyMv3tG8xouQ3879RkZhBhG+ETTzaYargyunsk5ddVwT7yY09Wlao9lELaAocGAp/DxdnTlX7wCNB8B9i+xizpiqNKjBILYmbgVgVewqxrUap20gKyKFiBCVkFtUypSv91NsUtuE3NkmGEdD9Y6GmpqfipPeCW8XbwB+OPkDb/zxhmW/XqenoWdD0gvSAXi87eMsOLwAgKGNhlZrNlELFefBDxMg9hd1PbQTjPgYAltqGstaDWs0jFWnVrEvZR//O/4/HmzxIIZa/Ljqr6QQEaICfjqYxO4zGVzMK6bYZMbX3YmHutZjfI8GVf5ZiTmJpBeks+v8Lo5fPM6WhC0ABLgG0Mi7kWUwstZ+rUnOSyajMIPT2acB9Zn0Mx2e4Z6m9/Bb/G88EPFAlecTtVh2Inw7GlKOqOudJqptQQzyI+V6dDod8wfM5/blt5OUm8SWhC0MrD9Q61hWQf7WCFFOJ1JyeHbZwTLb+jYL4PlBEVXy/iWmEpJykwj3CGdr4lambpl6zePSCtJIK0gDYETjEbzV8y10Oh1p+Wkcu3iM2MxYOgZ2BCCkTggPt3y4SvIJAUDCPlg2FvJSwdUHBrymNkYVN+Xi4MJ9ze7j8yOf83XM11KIXCKFiBDl9O/V0ZblqQOb4uZkYFT7WxsALC47jlWnVuHl7MXSmKWkFaTh7+pPHcc6ZY7rFdqLyW0nW1rex2bFUmwq5v5m91vapQS4BRDgFkCfsD63lEmI6zr8Pfz0NJiKILA1jPkWvOtpncqmjG4+mq+iv2J/6n6OZhyllV8rrSNpTgoRIcohOimb3WfUEUk/GduRoW2DK/weKXkpPLvlWRz0DnQN6kor/1bXvOuRXpBuaefRM6Qn/+nzH7ycvSz729dtT/u67Sv1fQhRKWYzbHlLHR8EIGIo3L0AnOvc+DxxlbpudRnccDDrzqxjacxSZvWepXUkzUkhIsR17DqVzqfbTmMyKyRk5gMwsn1IpYoQs2LmlR2vEJMRA8DhtMNl9ge7BxNSJ4QQ9xAGNxjMpvhNmMwmZvaYiZPB6da/GSEqqzgfVj4Gx9eq672eg9teA331Ns62Zw+3fJh1Z9ax9sxaugV3q/Xzz0ghIsQ1FJaYeOGHQ5y/NGkdqHPFTO5TvhFJFUXhSPoRcotzCXALYEfSDvak7MHF4MLUTlM5kn6Evcl7SStI4/b6t/N+3/fLdP3tG963yr8nISrMbIIVk+DEOjA4wYiPoN1orVPZvFZ+rXBzcCO/NJ9Xdr5Cv/B+Ze561jZSiAjxNxuik3n++0PkF5sI9nLhpUvjg9T3daNlyPWnsgZ1XpdPD33KutPrSC1IvWr/tM7TGN1c/Y9cURQKSgtwc5TxFoQVUhTY8NKlIsQZHloBDXtrncpuvNTlJV7b9RoAvZb1Yv/D+3HUO2qcShtSiAhxiaIozN96mnc3nrBsmzYogpE3aZBaWFrI1zFfs/P8zjKTWunQ0di7MWkFaWQXZTOw3sAy3Wh1Op0UIcI6KQps/BfsXQDo4O7PpAipYnc1vYtN8ZvYnrgdgD/O/1FrG5pLISIEUFRq4uWV0azYnwjAfZ3CGNu1Hh3KMVvuJwc/YdHRRWW2tQtoxyOtH+G2ercBatdcR0Pt/G1H2KA9/4Xdn6jLg96CVndpm8dOvd/3fSK/iQRgacxSeoX2Qq+rfW1vpBARtV5mXjGTv/6TvXEXMeh1zBzRioe71S/XuSazyVKEuBhc+HePf9OxbkdC6oSUOU6KEGEzCrNh23/U5Y7joPtT2uaxYy4OLnwy4BOe+u0p/kj+g88OfcYT7Z/QOlaNk0JE1Gqn03J5dNE+4jLy8XB24OMHO9K3WUC5zv1g/wfsTdkLgKeTJ1vv3yoFh7B9Oz+EgkzwbwZD54LGkzjau67BXS3L8w/Nl0JEiNpk1+l0pnz9J8bCUsJ8XPlyQiTNAm88I2Z+ST6p+akY9Aa+OPKFZfvt9W+XIkTYtpIC2Dobds5T1wf8W4ZsrwHOBmfqONYhtyQXgIuFF/F18dU4Vc2Sv2WiVvpuXzz/WhVNqVmhYz1vFozrjH8d5xuek1GQQb/v+5XZFuwezPDGw3mwxYPVmFaIGvDbm1fahYR1geYyUWJN+eXeX+jxbQ8AdibtZHjj4Ronqlm1r1WMqNXMZoVZ64/x4oojlJoVhrcL4X+PdbtpEQLw8o6Xr9o2vPFwnunwTK37DUbYmePr1AaqAM2GqKOmyiOZGuPh5MFjbR4DsPSiqU3kjoioNfKLS3nuu4NsPHoBgH8MaMpzA5uWGUjses5knWHX+V0AdAvuxrt93iW7OJtwj/BqzSxEtTKbYPNbsGOOut76Hrj3S20z1VJ9wvrw+ZHP2Xl+J6XmUhz0tefHc+35TkWtdsFYyKTFURxJysbJoOede9syqsONxwf59vi3fHzgY3xcfCg1lwJwW/htfHDbBwB4u3hXd2whqk9pEax4FI6tUde7PgG3v6FtplqsjX8bvJy9yC7K5lDaIToFdtI6Uo2RQkTYvT9OZ/DcdwdJMRbi6+7Egoc70bnB9R+l5JfksyFuA2/veRsAY7HRsu+RNjLdubAT2/6jFiEGJxj1KbS5V+tEtZpBb6BnSE9+Pvszvyf+LoWIEPYgu6CEN9fGsPxPdZCyxgHufDWhC/X8rj+aaXJuMk9tforYzFhAnRNiWudppOSl4OfqR7uAdjWSXYhqFfPTlZl0714gA5ZZiT5hffj57M9sT9rO1E5TtY5TY6QQEXan1GRm3ZFkZv18nBSjOmndnW2CmHV3W7xcr9/F9kjaEZ7Z/AwZhRkAuDm48VKXl2hft31NxBaiZuSlw5pn1eV63aHlKE3jiCt6hvREr9MTmxlLSl4KQe5BWkeqEVKICLtyLiOPf3x7gEOJ2QA09Hfn3Xvb3vBRDMDGuI38a8e/KDIVEeETwccDPq41/wmIWkRR4PP+6oBldYJgzDLpHWNFvF28aevfloNpB9meuJ37I+7XOlKNkO67wi4Ul5pZuOMsd37wO4cSs3Fy0DO5byN+/kfvGxYhiqKw4PACXtj2AkWmIvqG9WXxHYulCBH2adt/ICteXb7vK3D11jSOuNrlie9+T/xd4yQ1R+6ICLvw6o/RfBeVAECXhr7Me6A9Id6uNzyn2FTM63+8zurTqwF4qMVDvND5BQx6Q7XnFaLGRa+ArbPU5Q4PQf0e2uYR19Q7rDcfHviQPSl7KDIV4Wy4+RhHtk4KEWHzVh1ItBQhT/ZrzLRBERj0N77dnFmYydQtU9mfuh+DzsDLXV+uNbdBRS1TnAc75qpfAJ0fhaHva5tJXFeETwR1XeuSWpBKVEoUPUN7ah2p2smjGWHT9sdn8s/lhwF4tFdD/jmk+U2LkLPZZ3nw5wfZn7qfOo51mD9gvhQhwj6lHod3GsH2d8FcChFD4c53pV2IFdPpdPQO6w3A70m14/GMFCLCZqXlFPHk0v2UmBRahXgyfXDETc/Zk7yHB39+kIScBELrhLL0zqX0CJVb1MLOKArs/xq+GAilas8xWt0F93wO8ujR6l0uRLYnbkdRFI3TVD95NCNs0pYTqfxr5RFSjIU0DnDnu8ndcXG88X+wK06u4K3db1GqlNIuoB0f9P8AP1e/GkosRA0pyIT1L8Lh79R1/wgY8RHU63rj84TV6BbcDQe9Awk5CZwznqOBVwOtI1UrKUSETTGZFWb9fIwvdpwFwN3JwGcPd6KO8/X/KpeaS/lw/4d8dfQrAO5oeAdv9nyzVjQCE7VMeiwsHAQFF9X1juNh4Exwk0kZbYm7ozudAzuzO3k32xO3SyEihLX46WASX/x+liNJ6hghg1oG8sxtTWlS1+Oax5eYS1h4ZCGfHPzEsu3Jdk8ypd2Uck10J4RNybkAS+9WixBHNxg2F9qN1jqVqKTeob3Znbyb35N+Z1yrcVrHqVZSiAibcDzFyLPLDgLg4qjnvfvaMaxtyDWPvVh4ka9jvmbTuU3EGeMs22f3ns3QRkNrIK0QNawoB765Vx0jxLcRPPoruPtrnUrcgj5hfXg36l2iLkSRV5KHu6O71pGqTYUaq0ZHRxMZGYmPjw/Tp08vVyOaBQsWEBwcjKOjI4MGDSI5ObnSYUXtU2oy8/n2MwyZp7Yed3HUs/rpXtctQnYl7eLun+7miyNfEGeMw9PJk8faPMb6u9dLESLsk6kEvh8PKYfBzR8eWiFFiB2o71mfcI9wSs2l7E7erXWcalXuQqSoqIjhw4fTqVMnoqKiiImJYdGiRTc8Z8eOHbz66qt8/fXXnD17lsLCQl544YVbzSxqiZzCEiYtieL/fj5m2fbd491pFnj1o5hDaYdov6Q9kzdNtswVc3v92/lx5I/8o+M/CPMIq7HcQtSI3FTY/h58OwZO/6Y+jnnwe/WOiLB5Op2u1oyyWu5HM+vXryc7O5s5c+bg5ubG22+/zVNPPcXEiROve86JEyf49NNPGThwIAATJ05k9uzZt55a2L2krAIeXbSP4yk5uDjqmdK3Me3CvGkX7n3VsYk5iUxYPwGTYgLggYgHeKHzC7g4uNRwaiFqyPmD8P04yDqnrusMcN8iCK09U8fXBr1De/PNsW/4PfF3FEWx27Zt5S5EDh06RLdu3XBzU6dQb9u2LTExMTc859FHHy2zfuLECZo0aXLDc4qKiigqKrKsG43G8kYUduJQQhaPLo4iPbeIAA9nFo7vTNsw72sem5SbxB0r77Csz+s/jwH1BtRQUiFqWHE+zG11pVdMnSBofQ9E3AENe2ubTVS5zkGdcXVwJbUglROZJ2ju21zrSNWi3IWI0WikYcOGlnWdTofBYCAzMxMfH5+bnp+RkcFnn33G0qVLb3jcrFmzeP3118sbS9iZDdHJTP3uIIUlZpoHefDlhMir5oxRFIUNcRsoNhXzzbFvLNuX3LGEDnU71HRkIaqf2QwHlsC6F8Bcom4LagMj50NwW22ziWrjbHCma1BXtiZuZXvidilEHBwccHYuO+6Ci4sL+fn55SpEnnzySXr06MHQoTduMDhjxgyef/55y7rRaCQ8PLy8MYWNUhSFz7afYfb64wD0iwjg47Edy4wPsub0GopMRey/sJ81Z9ZYtrs5uPHVkK9o6deyxnMLUW3yL8KJ9erIqEdXQdxf2gn0ngYDXtMum6gxvcN6szVxK78n/s7jbR/XOk61KHch4uvrS3R0dJltOTk5ODk53fTcL7/8ku3bt3Pw4MGbHuvs7HxVwSPsW4nJzCurrsyeO757fV4d1hIHg9qW+pzxHKcyT/Hyjpevef4Ht30gRYiwLyfWw5pnIffClW2ObtB1MjQeII9hapHeoeq1Ppx+mKzCLLxdvLUNVA3KXYhERkbyxRdfWNbj4uIoKirC1/fGI/bt3buXqVOnsmbNGgIDAyufVNi8lOxC9sZdZN/Zi0Sdy8RYoN5iLiwxkZFXjF4Hrw1ryYSeVx4BLj+5nLd2v2VpiArg6eTJv7v/m03nNtEztCfdgrvV+PciRLUwJsPGl+HoSnXdtxEEtgJXH+g5FfwaaxpP1LzgOsE09WlKbGYsX0Z/yfOdn7/5STam3IVInz59yM7OZsmSJYwbN47Zs2czcOBADAYDRqMRV1dXHB0dy5xz4cIFhg8fzosvvkinTp3Izc0FoE6dOlX7XQirdi4jj4mL9nEmLe+6x7g7GfhobAdua64Wq2bFzLw/51mGZb/syXZPclfTuwhyD2JQg0HVmluIGlWYDYvuhItnAB30eBr6vwKO0vurtusV2ovYzFi+OvoV9za7l3qe9bSOVKV0SgWm9vvxxx8ZO3YsHh4emEwmtm3bRqtWrWjQoAHz5s1j1KhRZY6fN28ezz333FXvU5HZBI1GI15eXmRnZ+Pp6Vnu84T1WLjjLG+uVXtYtQ71JLKBL10a+JZphNrAzx0vN7WQzS/JZ8bvM9icsBmAJ9s/SZ+wPpSa1cnqhLA7yYdh7XOQFAWO7uqgZPW7a51KWIldSbuYvGmyZf2z2z+jR4j1zxpe3p/fFSpEAJKSkoiKiqJHjx4EBATcctCbkULE9ry4/DArDyRy+W+WSVFQFHigczj/uffGLfxT81N5ZvMzxGTE4Kh35M2eb8qIqMJ+5WXAuucg5id13akOjF8DoR21zSWsiqIo3L78di7kq22Ggt2D+eXeXzROdXPl/fld4blmQkNDCQ0NvaVwwv7kF5diVmD7yTRLo9O/Muh1DGp14zZCJy6e4KnfnuJC/gV8nH344LYPpDuusE85KfDnItj3BeSlATqo1x1uf12KEHEVnU7H0juXcvvy2wFIzkvm+MXjdtOdVya9E7fEbFZ4aeVhvo9KLLP9sd4NmdT7ylDTLo4GvFyvtCG6kHcBZ4OzpQX49sTtTN82nfzSfBp4NmD+gPmEe0q3bWFHFAUOfQuxv8CxNWAuVbf7NoL7Fst4IOKGgtyD+O2+33h156vsOr+Ln079RPMuUogIwTsbT1xVhLQM9uT52yNwdTIAUGIqYXHMYvJK8kjOS+bPC3+SkpcCQIh7CI28G7Hr/C7MipmuQV15v9/7eDl71fj3IkS1Wno3nN58ZT28G3R5DFqMAIebD4MgRF23ujzY4kF2nd/FujPreL7T8zgaHG9+opWTQkRU2rd74/nvttMAvH9fO4a2DQbA2UFfZk6EDXEb+GD/B2XONegMmBQT5/POcz7vPAB3N72bV7q9gqPe9v9hCWFRWgwbZ1wpQhxc4dGNECwNr0XF9QjpgZ+LHxmFGXRc2pF9D+6z+Xm1pBARlbIjNp1XflQHuHt2QFPu6XRldtv3o95n/dn1eDp74u3sTULOlTYjU9pNoVNgJ9r6t6VUKeV4xnGOXTxGaJ1QBtQbYLeTOolaKueCOjldwqVp3Ds8DCM/1jaTsGkOege6Bnfl57M/A9B7WW/2PbRP41S3RgoRUSFFpSY2RKfwr1XRmMwKo9qH0Kt1Nv/Z+x/L6KaLji4CsLTwvuyFzi8wvtX4Mtu6BHehS3CXGskuRI1Jj4VdH8H+JYACzp5w9+cQMUTrZMIOTGozyVKIFJoKyS7KtunH2VKIiAp5cflhfjyoPkqJbODD+P4GHv/1cQpNhWWOu7vp3QxpMISsoiyyirLQoWNE4xFaRBai+qXHwvoXwcEFiowQtwO41H89oAU8sBT8bzzzuBDl1dSnKd8O/ZYx68YA8OOpH6/6Jc+WSCEiyi0pq4DVh9QipEsDX16/J4Qnt0yg0FRIS7+WOOgdiEmPIdQjlOmdp1PHSUbQFbVA9EpY/giWwuOyiDvVuWEa9AG9XpNown619m/Na91f440/3uC7E9/xcMuH0ets8++ZFCKi3JbuPodZgR6N/VgwvjUPr3+Y9IJ0mvo0ZeGghdRxqkOxqRi9To+DXv5qCTtnNsGe/8LGfwGK2g3XMxTa3Af1e4B/U60TCjs3tOFQ5kbNJSEngR1JO+gT1kfrSJVim+WTqHGFJSaW7Y0HFMZ0DeKFbS9wKusU/q7+fHLbJ5a7H04GJylChP2L3QSf9lQnqEOByEnwdBRMWAudxksRImqEm6MbI5uMBOCp354iLjtO20CVJIWIKJfVh86TmV+CX/ivvHxgODvP78TF4MLHt31McJ1greMJUTPMZtj5IXxzD6QdAxcvGPIfuPM90Bu0TidqoQciHrAs/2vHvzRMUnnyq6u4KUVRWLwrDp0hl9I62y3bZ/eZTSv/VhomE6KGlBTCzg/g2Gq4oHZbp+kguHsBuPpom03Uag28GhDsHkxyXjJJuUkoimJzwyBIISJu6s9zmRw9b8Q1IAozpfi5+PHlkC9p5NXo5icLYavObFO736afhJTDZfdFPgZDZoEdjGopbN9Po36i73d9ySjMIDo9mjYBbbSOVCFSiIgbyisq5ZFF+wATdQL2UqjAtM7TpAgR9is3Fba/B3sXUKYnTJ1AdTyQsd+BX2PN4gnxd64OrvQL78f6s+vZELdBChFhXz74LRZjYSkOHjEUKhfxdfFlcIPBWscSouoVZEHCHlgzFXLUbuq0G6v2gKnfA3waSjdcYbUGNxjM+rPr+eXcL0zrPM2muvJKISKuK7eolG/3xAMQWv9PLprg3mb34mSQCbqEjVMUyDwL8XvU4iNhD6Qew3IHxNVHbYDa5l5NYwpRXr1Ce+Hu6E5KXgqH0w7Tvm57rSOVmxQi4prMZoVHvtpHTlEp9YKyuGg6jkFn4P5m92sdTYjKi14Bm/8PCrMgP+Pq/b6NoEFv6P8v8Ais8XhCVJazwZn+4f1Ze2YtG+M2SiEibN+yfQnsjbuIzpBDps9sAAbUG0Cgu/znLGyQ8TzsmAd7P7uyzeAEwe2hXlcI7wbhXaBOXa0SCnHLhjQYwtoza/kl7hemR063mcczUoiIq6TmFDJ7/TEAGjTbQvql7WNbjNUulBCVkZUAO+epvV9Mxeq2wDYwfB4EtgZH254+XYi/6h7SHQ9HD1ILUjmQeoBOgZ20jlQuUoiIq7y19hjGwlKah5VwQbcXFLXS7li3o9bRhLg5RVG73O7+FA4sBXOJur1eD+j3IjTsCzY2zoIQ5eFkcKJ/vf6sPr2ajXEbpRARtmnbyTRWHzqPwSmDJI93QYGOdTvybt93tY4mxI1Fr4CoryDu97LbG/SGvi9Cw97a5BKiBg1pMITVp1fz67lfeTHyRQw2MOKvFCLCYtneeF5aeQRQaNj8Fy5c+kXy0TaPappLiOtSFDi9WR33I35X2X0N+0C/GWrXWyFqiW7B3fB08iS9IJ39qfuJDIrUOtJNSSEiAMgpLOH1NTEA+ATEcKHkEACfDPjEZmd0FHYm+RAc/J/ayPSyy11vL2s3FpoNhrotIaBZzWcUQmOOBkcG1h/IytiVLDu+TAoRYTvWHk6moMQE+nzqhK4jqwieav+UFCFCe8X5sGMubH/n2vsdXKDTRHXMj9BO0v5D1HqD6w9mZexKfjn3C20Wt+HAwweselZ0600matR3+xJwCvgFZ//NZBVBI69GPNL6Ea1jidqktFgdZOziGSjOg8R96lgfJ9ZDce6V45oPA58G6rKrN3R4GDyCtEgshFXqEtylzPqWhC3cXv92jdLcnBQigpMXcjh0PoE6zTZbtr3a7VUZQVVUr+J82DoL0o7DxbNqEWIuvfaxjm4w6lNoOVLueAhxEw56B17p+gpv7XkLgD/O/yGFiLBu3+9LwMHrgGX9pS4v0Tmos4aJhN0zlcL3D8OpTWW3O9VRJ5RzdIe6LdSRTg1O0GqUDDYmRAU80PwBvFy8mL5tOtsSt2FWzFY7wJkUIrVccamZ5fsTcAzaB8Br3V/jvmb3aZxK2C2zWe1m+9vrkJ0AegfoORUa9AL/ZuAZInc8hKgi/cP74+7oTmp+KtHp0bQNaKt1pGuSQqSWm7L0T4zKadyd03AxuDCkwRCtIwl7UZQDF45CyhHISVa3nf0dEveqy3oHuPdL9XGLEKLKORuc6RPah/Vx69kUv0kKEWFdMnKL+L91x9h8PBXnYPVuyKAGg/Bw8tA4mbBJF2Lg0P/UBqfGJEjaDznnr32sUx1ocx/0eg586tdsTiFqmQH1B7A+bj2/nfuN5zo+h84K7zhKIVLLmM0Ky/Yl8J8Nx8kuKEHvkoCTdxQAdzW5S+N0wmakHod9X6h3OhL2QF7atY/zCIagNuDTEHR6cK6jdrX1Cq3ZvELUUr1De+OkdyI+J57YrFia+Vjf+DpSiNQi0UnZvPJjNAcTsgAz4fUPk+W2DIBAt0CbmZdA1LDTW64UGlnx8OdiyI6/+riwLupopg7OUK8b1G0F7n41m1UIUYaboxs9QnuwNWErv537TQoRoY2TF3L43554lvwRh1mBOh4pBDf+mZSik5Zjnu7wtFXeshMaOrIcNv4LclOuvb9eD2g2CPwj1LseXmHS0FQIKzSw3kC2Jmxl/qH5TG432ep6z0ghYsfMZoV/rjjM8j8T1Q36Qpq33Emy+TdSisy4GFwI8wjjX13/Jd11RVkXz8CqKVdmrjU4qXO2GJyh5QhoMlAGERPCRvQL72dZfvK3J/nvwP9qF+YapBCxY7PWH2P5n+fQuyYSXjeXUq91JJVcBOCOBnfwQuQL1HWTsRnEXxTnqQ1Pt/1HLUIa9oW7F0jRIYQN83L2sizvTNqpYZJrk0LETi3YfprPfz+Fa/gSHOqc4CJACTTwbMDLXV+me0h3rSMKa2A2q4OK7fkvZMRCbiqUFl7aqYPB/ydFiBB2YPGQxYzfMB6AlLwUgtyt59+1FCJ2wmRW2HU6nZzCUs6m5/HuxmO4BC/Hoc4JAPQ6PU+2e5KJrSfK0O0C8jLgj4/h0LKru9m6+UFwe+g0QW37IYSweR0DO9LSryUxGTGM+HEEex/cq3UkCylE7EDshRxeWH6YQwmZgNpY0LnuBhy9D2DQGZjbby5dg7vi5uimbVBR8wqNcGYr5KTAmS2Q9CcUZKlzuigm9RhHd+g8EVqMABdPCGgujU6FsEOXx4kqKC2g1FxqNTPyWkcKUSklJjMLtp/hg99iwOcXPCJ24YgXzkoIuYbDALze43X61+uvcVKhCbMZlo2FuN+vvd8/Ato9AO3GgmdwzWYTQtS413u8zpAV6ujZcdlxNPFponEilRQiNupYspHpyw8Rc/EILvWWY3BWx3koIZ0S0gGY2nEqI5vI8Nm1kqLAzrlqEeLoBqGd1Llc2t4PnqHq4GIyr4sQtUponVBa+7UmOiOaE5knpBARlVNcauaTLaf4ZGsMBr+NuNffCToFf1d/ZnSZgbPBmd3Juwn3CGdM8zFaxxU1qbQI0k6o87scWArndqjbh8yGTuO1zSaEsAqt/FtZCpGhDNU6DiCFiE2JTsrmhR8OEZt9CJcGK9A7ZQAwovEI/hn5T0sXrb7hfbWMKapTQabavTY1Rp29VlHUuV0uHIX02CvtPkAd86Pns9BxnHZ5hRBW5fLIqicvnrzJkTVHChEbUFRq4sPfYvnv9mM4+K/HrcEfANR1q8u/u/+bPmF9NE4oqkX6KfjzK3X22rTjagPT/Iwbn+PiDYGtIbQDdJ2ijnYqhBCXRPhGAHAi84TGSa6QQsSKFZaY2HI8lTm/nuRM7kFcGqxE76QOSHZP03uY1nmazJZrb7ITIeYnOLoKEvdd+xivehDYCnwvTSTn7q8WH4Gt1EnmpN2HEOI6mno3RYeO9IJ00gvS8Xf11zqSFCLWptRkZtfpDFYfOs/GmNMUukThErQGt0tzhwW7BzOzx0x6hPTQNqi4NWYTnD8Ip39TCw7jefWr4GLZ48K7QcuRUK8rOLiodzhcvK75lkIIcTNujm7U96xPnDGOkxdP4h8qhYi4ZPeZDL7fl8C2U0lkcxhHrwMY6p/ARWe2HPNAxAM81+k53B3dNUwqyqUgSx0uPT8DcpLVr9Jiddj0xH3q2B4Fmdc4UafO6dLqLnU+F58GcodDCFGlmvk0I84Yx4nME/QI1f6XWilENBaXnsfrP//BrsxvcPT6E12Yguvfjmnq05SXIl+iS3AXTTKKmyjIVEcoLc6D8wcg8xxciAaUG5/n7AWN+qjzufg0ULvTyh0PIUQ1i/CN4Jdzv1hNOxEpRGpYdEo8n0atJCYjBldTBGcyk3Hw3YKTd7HlmGD3EIY1GsrQRkNp7N1Yw7QCgJJCtWdKYZbaO+X8QbUtR3YiGBOhMPva5+kdwNVXnavFIxgcL5WYARHQeIA6todB/gkKIWpWhM+lBqsXpRCpNY6nJfLpvh/5I2Uz+fpT6HSXflM2/IHjpcdzTb1aMaTRbXQO7Ez7uu3R6/TaBbYHF8+ohYKiQPJByE6q2Pk5yerdjZL8m/dUAXCqA8HtIKQDhHeFoNbg26hS0YUQojpd7jkTlx1HsalY8/nHpBCpJqczUvh034/sSN5Eru6kWnwY1JlgXEyNaeHbhviCKJwdHJja+UmGNBiCTtoCVEzin5B7Ac7vVx+HJEWpk7mZiqG0oGo/y9FNvbvh5AZNB4F/U/UximcYeIWCs/ReEkLYhkC3QDydPDEWGzmddZoWfi00zSOFSBWKz0pj/t4f2Z60CaPuODqdGfRq8eFsakBkwG1M7nwX7YMbaB3VdplK1Qafsb/C9w/f+Ng6QeDqAwZHtWtrRcbUMDirPVVcfdW2G64+0mhUCGEXdDodEb4R7EvZx4nME1KI2Lrzxot8unc1WxJ/IYujZYoPJ1M4nfz683inu+gcZh1j+tsssxlOrIOVk6Ek78p2vybqIF4GR7WnSVgkOHuCcx21bYYQQoirRPhcKkSsoJ2IFCKVcCE3m8/2reHX+I1kmo+g05tApxYfDqWhdPDry6MdRtGzvrZVptUzlUL6SbUNR1769Y8rLYL9SyA7vux2v6bw+Fa16BBCCFFul4d6t4aeM1KIlFNGfg6f7VvLL3EbSTcfQqcvBdSBLQ2lQbT16csj7UfSr1EbjZNqLCcFclPVdhoFmepXTgocWw3F+VeOU8yQGVfxthyhnWHsd+rgXo5uoJdGvUIIUVGWod4vnkBRFE3bKEohcgNZBXl8HvUz689uJNW0H52+BFCLD31pAK29+zC+7SgGNm6L3p5/IOalqxOqAaBAxilIPf63Y9IgYTdkxV91+g1d7m3iFX7jNhiBraHzI2pjUSGEELeksXdjHHQOGIuNXMi/QJC7do+ypRD5m5yiAhb+uZF1p9eTXPonOn0RcLn48KO5Z28eaj2CoRGd7K/4MJXAnv9eKTpyL0DSfshLLf976PTgHgAGJ7WB51+/AlupvU0u8whR23jY25+jEEJYOWeDMw28GnAq6xQnLp6wnUIkOjqaiRMncurUKSZNmsQ777xz09s527ZtY8qUKaSlpfHyyy/z/PPP31Lg6pBfUsRXf/7C6lPrOV+8DwyFgPozVVfqTTOPXoxtNYJRLbraRvGhKOpMrZdlnoOUw1cfZy6Fs9vgxAYoygFT0fXf081PLSZAvYtRrzs4OF/Z7+SuDtAVFgkunlXzfQghhKg2Eb4RaiGSeYK+4X01y1HuQqSoqIjhw4czePBgli1bxj/+8Q8WLVrExIkTr3tOWloaI0aMYNq0aYwZM4bRo0fToUMH+vfvXyXhb0VhSTFLDv7GqpM/k1i0FwyX2i8YQGfyorFbD0a3HM49rXrgYDDUTChTiVoQ/FVBJpzbxU2HCwcoKVCPPbNVHQW0MpzqQLsx4BGortdtBXWbg09D6b4qhBB2JMIngnWs07znTLkLkfXr15Odnc2cOXNwc3Pj7bff5qmnnrphIfLNN98QHBzMq6++ik6n47XXXmPhwoWaFyIpOZkM/uEOzIZL3UANoDe508y5A/c07M+9EZFXio+cCo7IWV7GZDj4jdreAtTGmylHoDi3Gj5Mp4746XSNyfIc3aDJAIi4Q70FdHnQLiGEEHbNMtS7xj1nyl2IHDp0iG7duuHmpv6Qatu2LTExMTc957bbbrM8vunSpQszZsy44TlFRUUUFV15RGA0GssbsdyCPHxoXmokGRiYl8/gvHw6FxZh4BjE/g9+qfKPvHWhndW2Fzei06sNPxv3v9QW49IdDIOTFBdCCCHKaOarduGNN8aTX5KPm6M2PyfKXYgYjUYaNmxoWdfpdBgMBjIzM/Hx8bnuOS1btrSse3p6kpR04zsMs2bN4vXXXy9vrEp7P99A3dxU1BH2dWp30JpkcFbvQjS9HfSX7r44ukODXmrh8Fc6vTToFEIIUaX8Xf3xc/FDr9OTkp9CIy9t5scqdyHi4OCAs7NzmW0uLi7k5+dftxD5+zmXj7+RGTNmlGnQajQaCQ8PL2/McgubeqTK31MIIYSwJWvvWksdJ20HhSx3IeLr60t0dHSZbTk5OTg5XX/WPl9fX9LS0sp9PICzs/NVBY8QQgghqp7WRQhAue/3R0ZGsnv3bst6XFwcRUVF+Pr6lvucgwcPEhoaWsmoQgghhLA35S5E+vTpQ3Z2NkuWLAFg9uzZDBw4EIPBgNFopKSk5KpzRowYwY4dO9iyZQulpaW89957DB48uOrSCyGEEMKmVaiNyIIFCxg7dizTp0/HZDKxbds2QO1BM2/ePEaNGlXmHH9/f95//30GDx6Ml5cX7u7uLFy4sEq/ASGEEELYLp2iKOUYKeuKpKQkoqKi6NGjBwEBN+lOesmpU6c4duwYffv2xdOzYqNuGo1GvLy8yM7OrvC5QgghhNBGeX9+V7gQqWlSiAghhBC2p7w/v2VwCiGEEEJoRgoRIYQQQmhGChEhhBBCaEYKESGEEEJoRgoRIYQQQmhGChEhhBBCaEYKESGEEEJoRgoRIYQQQmim3EO8a+XyeGtGo1HjJEIIIYQor8s/t282bqrVFyI5OTkAhIeHa5xECCGEEBWVk5ODl5fXdfdb/RDvZrOZ8+fP4+HhgU6n0zqOXTEajYSHh5OQkCDD52tMroV1kethPeRaWJeKXA9FUcjJySEkJAS9/votQaz+joherycsLEzrGHbN09NT/oFbCbkW1kWuh/WQa2Fdyns9bnQn5DJprCqEEEIIzUghIoQQQgjNSCFSizk7O/Pvf/8bZ2dnraPUenItrItcD+sh18K6VMf1sPrGqkIIIYSwX3JHRAghhBCakUJECCGEEJqRQkQIIYQQmpFCRAghhBCakULEjkVHRxMZGYmPjw/Tp0+/6Xj/AO+++y6BgYF4enpyzz33kJGRUQNJ7V9lrsVlo0eP5plnnqnGdLXPrVyPkpIS2rRpw9atW6svYC1SmWuxYMECgoODcXR0ZNCgQSQnJ9dA0tqhMtdj27ZttGjRAn9/f+bMmVPhz5RCxE4VFRUxfPhwOnXqRFRUFDExMSxatOiG52zfvp3Fixezfft29u/fT2FhIdOmTauZwHasMtfiso0bN7J582befPPN6g1Zi9zK9QB45513iI6Orr6AtUhlrsWOHTt49dVX+frrrzl79iyFhYW88MILNRPYzlXmeqSlpTFixAjGjBnDH3/8wTfffMOWLVsq9sGKsEurVq1SfHx8lLy8PEVRFOXgwYNKz549b3jOu+++q0yfPt2y/vXXXyvdu3ev1py1QWWuhaIoSn5+vtKoUSNl4cKF1R2xVqns9VAURTl58qTi7e2tNGjQQNmyZUs1pqwdKnMtvvjiC2XFihWW9S+//FJp1qxZteasLSpzPebOnatEREQoZrNZURRF+fHHH5UHH3ywQp8rd0Ts1KFDh+jWrRtubm4AtG3blpiYmBue07p1a1auXMnp06dJTU1l4cKF3H777TUR165V5loAvPnmmxQUFODg4MDmzZsr9PhAXF9lrwfA5MmTeemll6hfv351Rqw1KnMtHn30Ue6++27L+okTJ2jSpEm15qwtKnM9Dh06xG233WaZlLZLly7s37+/Qp8rhYidMhqNNGzY0LKu0+kwGAxkZmZe95whQ4bQtGlTmjRpQmBgIHl5ebz00ks1EdeuVeZaxMfHM2fOHJo0aUJ8fDzTp0/n7rvvlmKkClTmegB89dVXZGdny+PKKlTZa3FZRkYGn332GU8++WR1RaxVKnM9/n6Op6cnSUlJFfpcKUTslIODw1VD8Lq4uJCfn3/dc77//nvOnTvH8ePHycjIoHXr1jz00EPVHdXuVeZaLFq0iMDAQH799VdeeeUVtm7dyrZt2/j111+rO67dq8z1SEtLY8aMGSxcuBAHB6uftNxmVOZa/NWTTz5Jjx49GDp0aHXEq3Uqcz3+fk5Frp/lPSoWU9gKX1/fqxrU5eTk4OTkdN1zvv32W5544gkiIiIAmDdvHl5eXmRlZeHt7V2dce1aZa5FYmIiAwYMsPwD9/DwoGnTppw9e7Zas9YGlbkeU6dO5dFHH6V9+/bVnK52qcy1uOzLL79k+/btHDx4sJrS1T6VuR6+vr6kpaWV+/hrkTsidioyMpLdu3db1uPi4igqKsLX1/e655SWlnLhwgXL+uUucSaTqfqC1gKVuRbh4eEUFBRY1s1mM4mJidI2oQpU5nr873//46OPPsLb2xtvb2927NjBsGHDmD17dk1EtluVuRYAe/fuZerUqSxbtozAwMDqjllrVOZ6/P2cgwcPEhoaWrEPrkzLWmH9SkpKlICAAGXx4sWKoijK5MmTlWHDhimKoijZ2dlKcXHxVefMmjVLCQgIUD799FNl0aJFSvv27aXXTBWozLU4fvy44u7urixfvlxJSEhQ/vnPfyp+fn6K0Wis0ez2qDLX4+zZs2W+unbtqnz77bdKZmZmTUa3O5W5FikpKUrdunWVt956S8nJybF8iVtXmeuRlpamuLi4KJs3b1ZKSkqUoUOHKk8//XSFPlcKETu2atUqxdXVValbt67i5+enREdHK4qiKPXr11dWrVp11fEFBQXKM888o4SEhChOTk5K3759lVOnTtVwavtU0WuhKIqydu1apX379oqLi4vSqlUrZceOHTWY2L5V5nr8Vd++faX7bhWp6LWYO3euAlz1JapGZf5tfPLJJ4qjo6Pi7++v1K9fX0lJSanQZ+oURZrh27OkpCSioqLo0aMHAQEBWsep1eRaWBe5HtZDroV1qcz1OHXqFMeOHaNv3754enpW6POkEBFCCCGEZqSxqhBCCCE0I4WIEEIIITQjhYgQQgghNCOFiBBCCCE0I4WIEEIIITQjhYgQ4rq2bt1KgwYNauzzZs6cyYQJEyp9/qJFi+jXr98tHyOEqDlSiAghLPr168eiRYu0jiGEqEWkEBFCCCGEZqQQEUIwZcoUdDod27ZtY+LEieh0OqZMmWLZv3r1aurXr4+Pjw8ffvihZfuECROYOXMmS5cuJSIigo8//tiyb9++fXTt2hUvLy/uvvtusrOzLfuWLl1KgwYNcHd354477iAjI6NMnjfeeANvb2/q16/P77//btm+fPlyIiIi8Pf35+mnn6awsLBc39+bb75JQEAATZo0Yf/+/RX+8xFCVB8pRIQQzJ07l8zMTHr27Mknn3xCZmYmc+fOBSAjI4PZs2ezbt06Xn/9daZPn15mZuCNGzcyf/585syZw6hRowDIysrijjvuYOjQoRw5coT8/HymTZsGQG5uLhMnTmT27NnExMTg4ODAe++9Z3m/n3/+mVOnTrF//3569uzJv/71LwCioqIYP348//nPf9ixYwdRUVG89NJLN/3eVq9ezdy5c1mxYgVLlizhm2++qao/NiFEFXDQOoAQQnuurq64urri4OCAm5sb3t7eln25ubl8+umntG7dmmbNmvHss8+SmppK/fr1AThz5gwnT57Ey8vLcs7atWtxdHTk1VdfRafT8dxzz/Hwww8DYDAYcHR0pKioiLp167J69Wr+OtOEwWBgwYIFuLi4MGHCBCZPngzA559/zoMPPmgpdubMmcPAgQOZO3cuOp3uut/bqlWrePDBB+nTpw8AkyZNYs+ePVXy5yaEuHVyR0QIcUM+Pj60a9cOACcnJ4AyhcO4cePKFCGgTpqVlpaGj48P3t7e3HfffaSlpVFYWIirqys//PADCxYsICAggCFDhnDmzBnLud27d8fFxcXyeZc/KyEhgUaNGlmOa9SoEQUFBaSnp98wf3JyMuHh4WXOE0JYDylEhBAWer2ev8+DebOZNN3d3a/aFhYWRufOnTl48CAHDx7k0KFDHDhwAEdHRzIyMvDx8WHnzp1cuHCBunXr8txzz9308+rVq1emYDl9+jRubm74+/vfMF/dunU5f/68ZT0+Pv6GxwshapYUIkIIiyZNmrBp0yaSk5PZtGkTJpOpUu8zdOhQzp07x969ezEYDCxbtowhQ4agKArp6ekMGDCADRs2YDQa0ev1mM3mm77npEmT+Oabb/jxxx85ceIE06ZN4/HHH7/hYxmAkSNH8s0337Br1y727NnD559/XqnvSQhRPaSNiBDC4tVXX2XMmDE0bNiQ8PBw5s+fX6n38fb2ZvXq1Tz99NNER0fTqlUrVq9ejYODAxEREbz//vs88cQTpKSk0K5dOxYuXHjT9+zcuTOLFy/mxRdfJCMjgwceeIBZs2bd9Ly7776bw4cPM3LkSPz8/Bg5ciSxsbGV+r6EEFVPp/z9PqwQQgghRA2RRzNCCCGE0IwUIkIIIYTQjBQiQgghhNCMFCJCCCGE0IwUIkIIIYTQjBQiQgghhNCMFCJCCCGE0IwUIkIIIYTQjBQiQgghhNCMFCJCCCGE0Mz/A6VFPnr69C2NAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(thres[1:], tpr[1:])\n",
    "plt.plot(thres[1:], fpr[1:])\n",
    "plt.plot(thres[1:], tpr[1:] - fpr[1:])\n",
    "plt.xlabel('threshold')\n",
    "plt.legend(['tpr', 'fpr', 'tpr-fpr'])\n",
    "plt.gca().invert_xaxis() \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "8fa5fb54-8aa8-42eb-b0b9-6556e02a6da0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4744656418256471"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max(tpr - fpr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "293d7fcf-1518-40a4-bf41-00f4338bd600",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "      <th>TPR-FPR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>inf</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.930369</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.002874</td>\n",
       "      <td>0.002874</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.867342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.034483</td>\n",
       "      <td>0.034483</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.864187</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.034483</td>\n",
       "      <td>0.032598</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.857304</td>\n",
       "      <td>0.001885</td>\n",
       "      <td>0.040230</td>\n",
       "      <td>0.038345</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         阈值      假警报率       命中率   TPR-FPR\n",
       "0       inf  0.000000  0.000000  0.000000\n",
       "1  0.930369  0.000000  0.002874  0.002874\n",
       "2  0.867342  0.000000  0.034483  0.034483\n",
       "3  0.864187  0.001885  0.034483  0.032598\n",
       "4  0.857304  0.001885  0.040230  0.038345"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# KS值对应的阈值\n",
    "a['TPR-FPR'] = a['命中率'] - a['假警报率']\n",
    "a.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "1e88efcb-9a5f-40c6-a694-593fff24f6de",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4744656418256471"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 另外一种获取KS值的方式\n",
    "max(a['TPR-FPR'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1299363a-16f1-42b3-8c36-107127dc2784",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>阈值</th>\n",
       "      <th>假警报率</th>\n",
       "      <th>命中率</th>\n",
       "      <th>TPR-FPR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>224</th>\n",
       "      <td>0.27769</td>\n",
       "      <td>0.255419</td>\n",
       "      <td>0.729885</td>\n",
       "      <td>0.474466</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          阈值      假警报率       命中率   TPR-FPR\n",
       "224  0.27769  0.255419  0.729885  0.474466"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取KS值对应的阈值等信息\n",
    "a[a['TPR-FPR'] == max(a['TPR-FPR'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2829b831-0971-4623-9cf7-b57e7a27dbac",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
